После долгих чтений о сериализации я решил попробовать создать DTO. После большего чтения я решил использовать AutoMapper.С NHibernate, как я могу создать INHibernateProxy?
То, что я хотел бы сделать, это преобразовать родительский элемент (достаточно просто) и преобразовать свойства объекта, если они были инициализированы, что я сделал с помощью ValueResolvers, как показано ниже (я могу попытаться сделать его общим после получения он полностью работает). Эта часть работает.
public class OrderItemResolver : ValueResolver<Order, OrderItem>
{
protected override OrderItem ResolveCore(Order source)
{
// could also use NHibernateUtil.IsInitialized(source.OrderItem)
if (source.OrderItem is NHibernate.Proxy.INHibernateProxy)
return null;
else
return source.OrderItem;
}
}
}
Когда я преобразуем DTO обратно к объекту, для лиц, которые не были инициализированы, я хочу, чтобы создать прокси-сервер, так что, если компания хочет получить к нему доступ, он может. Однако я не могу понять, как создать прокси. Я использую замок, если это актуально.
Я пробовал кучу вещей без везения. Следующий код - беспорядок, главным образом потому, что я пытался наугад, не зная, что я должен делать. У кого-нибудь есть предложения?
public class OrderItemDTOResolver : ValueResolver<OrderDTO, OrderItem>
{
protected override OrderItem ResolveCore(OrderDTO source)
{
if (source.OrderItem == null)
{
//OrderItem OrderItem = new ProxyGenerator().CreateClassProxy<OrderItem>(); // Castle.Core.Interceptor.
//OrderItem OrderItem = new ProxyGenerator().CreateClassProxy<OrderItem>();
//OrderItem.Id = source.OrderItemId;
//OrderItem OrderItem = new OrderItem();
//var proxy = new OrderItem() as INHibernateProxy;
//var proxy = OrderItem as INHibernateProxy;
//return (OrderItem)proxy.HibernateLazyInitializer
//ILazyInitializer proxy = new LazyInitializer("OrderItem", OrderItem, source.OrderItemId, null, null, null, null);
//return (OrderItem)proxy;
//return (OrderItem)proxy.HibernateLazyInitializer.GetImplementation();
//return OrderItem;
IProxyTargetAccessor proxy = new Castle.Core.Interceptor.
var initializer = new LazyInitializer("OrderItem", typeof(OrderItem), source.OrderItemId, null, null, null, null);
//var proxyFactory = new SerializableProxyFactory{Interfaces = Interfaces, TargetSource = initializer, ProxyTargetType = IsClassProxy};
//proxyFactory.AddAdvice(initializer);
//object proxyInstance = proxyFactory.GetProxy();
//return (INHibernateProxy) proxyInstance;
return null;
//OrderItem.Id = source.OrderItemId;
//return OrderItem;
}
else
return OrderItemDTO.Unmap(source.OrderItem);
}
}
Спасибо, Эрик
Может быть, я более сложным его. Кажется, это работает. Кто-нибудь видит какие-либо проблемы с ним?
public class OrderItemDTOResolver : ValueResolver<OrderDTO, OrderItem>
{
protected override OrderItem ResolveCore(OrderDTO source)
{
if (source.OrderItem == null)
return NHibernateSessionManager.Instance.Session.GetISession().Load<OrderItem>(source.AgencyId);
else
return OrderItemDTO.Unmap(source.OrderItem);
}
}
Я сам не большой поклонник этого подхода, поэтому я определенно понимаю ответ «не надо». Я хочу сделать это в ограниченном сценарии. Причина, по которой я пытаюсь это сделать, я работаю над классическим сайтом ASP.NET. Продукты, которые я продаю, очень настраиваемые; выбор некоторых параметров, включение других опций, все из которых диктуют ценообразование. Если я заполню свою сущность, я могу вызвать функцию, чтобы оценить ее. Ценообразование поступает в базу данных для получения таблиц динамических цен на основе опций. В настоящее время я перестраиваю сущность на каждом посту/обратном вызове, который является утомительным. Я надеялся на что-то более автоматическое. – Eric
Это делает вещи более проблематичными.Некоторые возможные варианты: - Использовать объекты запроса, которые инкапсулируют поиск цен. Я делаю это с объектами, которые возвращают DetachedCriteria, чтобы мои контроллеры (в MVC) могли добавлять пейджинг, сортировку и т. Д. Вы могли бы создать базовый класс, который затем может быть настроен для каждого обстоятельства. - Предварительно рассчитайте цены. Конечно, вы говорите, что у вас много вариантов, поэтому это может быть очень большой набор данных. Возможно, что-то может работать с NoSQL DB. Я все равно решительно возражаю против расположения DTO 1: 1 и сопоставленного объекта. Он просто просит неприятностей. – AbstractCode
Это система, которую я унаследовал, которая иногда может быть немного архаичной. Ценообразование охватывает около 10 различных таблиц и требует широкого доступа к данным. У нас есть работа с перестройкой объекта на основе viewstate, но он уродлив. – Eric