【问题标题】:Convert from NHibernate to Entity Framework checking type of an instance从 NHibernate 转换为实体框架检查实例的类型
【发布时间】:2013-03-06 19:58:36
【问题描述】:

与我合作的团队的任务是将 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 扩展以使用实体框架?

【问题讨论】:

    标签: entity-framework fluent-nhibernate structuremap


    【解决方案1】:

    这里只是从臀部拍摄(我对NHibernate了解不多),使用框架(ref msdn)中的Type.IsInstanceOfType()怎么样?

    所以你的代码看起来像

    CartItemType get_cart_item_type(Registration registration)
    {
        if (typeof(FirstTimeRegistration).IsInstanceOfType(registration))
        return CartItemType.FirstTime;
    
        if (typeof(ReplacementRegistration).IsInstanceOfType(registration))
        return CartItemType.Replacement;
    
        if (typeof(RenewalRegistration).IsInstanceOfType(registration))
        return CartItemType.Renewal;
               ...
               ...
    
        throw new ArgumentException("Registration Type is unknown");
    }
    

    表情看起来有点倒退,但是……

    【讨论】:

    • 这似乎工作正常,即使是代理类。谢谢。
    • 我是这样做的,所以使用该方法的代码没有改变。 public static bool is_instance_of&lt;T&gt;(this object instance) { return typeof(T).IsInstanceOfType(instance); }
    • 更好。我在我的项目中尝试过,Resharper 提出了一个更简单的建议:return instance is T;
    【解决方案2】:

    你可能会遇到麻烦。 NHibernate 支持很多 Entity Framework 5(甚至 6)不支持的东西。我也很惊讶,但是在research 之后,我很确定你有一个不可能完成的任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多