1

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

4

2 回答 2

1

你可能在这里遇到了麻烦。NHibernate 支持很多 Entity Framework 5(甚至 6)不支持的东西。我也很惊讶,但经过一番研究,我很确定你有一个不可能完成的任务。

于 2013-03-13T20:42:15.253 回答
1

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

所以你的代码看起来像

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");
}

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

于 2013-03-06T20:15:00.457 回答