私が協力しているチームには、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<>拡張機能を変更する方法を理解することです。