2013-03-06 40 views
1

我與已經給出了使用FluentNHibernate轉換的MVC 4應用程序使用實體框架5.從NHibernate的轉換,以一個實例的實體框架檢查類型

該項目的任務工作的團隊使用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類。

下已經被添加到我們的國際奧委會轉換爲EF:

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

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

我似乎有是找出我如何可以改變is_instance_of <>擴展與實體框架工作的問題?

回答

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

表達看起來略有倒退,但...

+0

這似乎工作正常,即使與代理類。謝謝。 – 2013-03-06 20:40:26

+0

我這樣做了,所以使用該方法的代碼沒有改變。 'public static bool is_instance_of (this object instance) { return typeof(T).IsInstanceOfType(instance); }' – 2013-03-08 06:16:05

+0

更好。我在我的項目中嘗試了它,並且Resharper提出了一條更簡單的路線:'返回實例是T;' – Ackroydd 2013-03-08 21:15:31

1

你可能會在這裏出事。 NHibernate支持很多Entity Framework 5(甚至6)不支持的東西。我也很驚訝,但在一些research之後,我確信你不可能完成一項任務。