1

私が協力しているチームには、MVC4アプリケーションをFluentNHibernateの使用からEntityFramework5の使用に変換するタスクが与えられています。

プロジェクトは、依存性注入にStructureMapを使用しています。現在、IOCは次のようになっています。

ForSingletonOf<ISessionFactory>().Use(SessionConfiguration.get_session_factory);

For<ISession>()
    .HttpContextScoped()
    .Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession())
    .EnrichWith((ISession session) => new TransactionManagementSessionDecorator(session));

プロジェクトにはいくつかのオブジェクト拡張機能が含まれており、そのうちの1つは次のとおりです。

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クラスを継承します。

EFに変換するために、IOCに次のものが追加されました。

For<RegistrationContext>()
    .HttpContextScoped()
    .Use(x => new RegistrationContext());

For(typeof(IEFRepository<>)).Use(typeof(EFRepository<>));

私が抱えていると思われる問題は、エンティティフレームワークで動作するようにis_instance_of<>拡張機能を変更する方法を理解することです。

4

2 に答える 2

1

ここでヒップから撮影するだけです(NHibernateについてはあまりわかりません)。フレームワークからType.IsInstanceOfType()を使用するのはどうですか(ref 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 に答える
1

ここで困っているかもしれません。NHibernateは、Entity Framework 5(または6)がサポートしていない多くのことをサポートしています。私も驚きましたが、調べてみると、ミッション・インポッシブルだと思います。

于 2013-03-13T20:42:15.253 に答える