我正在与之合作的团队的任务是将 MVC 4 应用程序从使用 FluentNHibernate 转换为使用 Entity Framework 5。
该项目使用 StructureMap 进行依赖注入。目前国际奥委会是这样的:
ForSingletonOf<ISessionFactory>().Use(SessionConfiguration.get_session_factory);
For<ISession>()
.HttpContextScoped()
.Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession())
.EnrichWith((ISession session) => new TransactionManagementSessionDecorator(session));
该项目包含一些对象扩展,其中之一是:
public static bool is_instance_of<T>(this object instance)
{
if (instance is INHibernateProxy)
return ObjectFactory.GetInstance<ISession>().GetSessionImplementation().PersistenceContext.Unproxy(instance) is T;
return instance is T;
}
例如,上面的扩展名将像这样使用:
CartItemType get_cart_item_type(Registration registration)
{
if (registration.is_instance_of<FirstTimeRegistration>())
return CartItemType.FirstTime;
if (registration.is_instance_of<ReplacementRegistration>())
return CartItemType.Replacement;
if (registration.is_instance_of<RenewalRegistration>())
return CartItemType.Renewal;
...
...
throw new ArgumentException("Registration Type is unknown");
}
FirstTimeRegistration、ReplacementRegistration 和 RenewalRegistration 类都继承了 Registration 类。
以下已添加到我们的 IOC 以转换为 EF:
For<RegistrationContext>()
.HttpContextScoped()
.Use(x => new RegistrationContext());
For(typeof(IEFRepository<>)).Use(typeof(EFRepository<>));
我似乎遇到的问题是弄清楚如何更改 is_instance_of<> 扩展以与实体框架一起使用?