2012-04-15 47 views
2

我有我想使用NHibernateRepository的IRepository接口。帶有泛型的結構映射配置

我如何配置它與結構圖?

protected void ConfigureDependencies() 
{ 
    ObjectFactory.Initialize(
     x => 
      { 
       x.For<ILogger>().Use<Logger>(); 
       x.For<IRepository<T>>().Use<NHibernateRepository<T>>(); 
      } 
     ); 
} 

我M於T.

收到錯誤
+0

試試這個:'x.For(typeof運算(IRepository <>))使用(typeof(NHibernateRepository <>));' – Steven 2012-04-16 07:11:58

回答

2

如果您希望能夠關閉所有類型的IRepository<>映射到相應封閉式的NHibernateRepository<>,用途:

x.For(typeof(IRepository<>)).Use(typeof(NHibernateRepository<>)) 
0

這條線被期待爲通用參數T取代:

x.For<IRepository<T>>().Use<NHibernateRepository<T>>(); 

即,哪種類型T將被存儲在存儲庫?您選擇NHibernateRepository類作爲IRepository的實現,但未顯示將存儲哪個內部類。

或者,看看使用非通用IRepository,在這裏看到:Generic repository - IRepository<T> or IRepository

+0

接口和實現都是通用的,所以我可以使用任何模型類。 – DarthVader 2012-04-15 23:26:24

+0

您可以絕對,但是您不能在代碼中使用泛型類型,因爲它在類中未聲明。也許使用沒有泛型的IRepository,或者嘗試其他答案所建議的動態。 – yamen 2012-04-15 23:31:48

0

也許替換<T>動態?

x.For<IRepository<dynamic>>().Use<NHibernateRepository<dynamic>>(); 

至於第二點,Singleton/Service Locator模式是一個激烈的爭論。

0

看看this article。基本上,你想做的事是這樣的:

public void ConfigureDependencies() 
{ 
    ObjectFactory.Initialize(x => x.Scan(cfg => 
    { 
     cfg.TheCallingAssembly(); 
     cfg.IncludeNamespaceContainingType<Logger>(); 
     cfg.ConnectImplementationsToTypesClosing(typeof(NHibernateRepository<>)); 
    })); 
} 

關於ApplicationContext的靜態類:如果你真的有一個橫切關注點,那麼,我認爲沒有什麼不妥的地方。