2011-05-16 86 views
0

我想配置Structuremap像下面這樣,但我似乎可以得到它完全正確幫助structuremap配置

ObjectFactory.Initialize(x => { 

    x.For<TunaRepository>() 
     .Use(new TunaRepository(serviceEndpoint)) 
     .Named("Tuna"); 

    x.For<CodRepository>() 
     .Use(new CodRepository(serviceEndpoint)) 
     .Named("Cod"); 

    x.For<HaddockRepository>() 
     .Use(new HaddockRepository(serviceEndpoint)) 
     .Named("Haddock"); 

    x.For<IFishRepository>().AddInstances(y => 
             { 
              y.OfConcreteType<TunaRepository>(). 
              // Somehow add all instances here??? 

             }); 

    x.For<TunaController>().Use<TunaController>() 
     .Ctor<IFishRepository>("repo").Is<TunaRepository>(); // This Is should use the instance registered above 

    x.For<CodController>().Use<CodController>() 
     .Ctor<IFishRepository>("repo").??? 

    x.For<HaddockController>().Use<HaddockController>() 
     .Ctor<IFishRepository>("repo").??? 

}); 

在我的代碼點我希望能夠做到:

var instances = ObjectFactory.GetAllInstances<IFishRepository>(); 

也:

var instance = ObjectFactory.GetNamedInstance<IFishRepository>("Cod"); 

,還可以使用IFishRepository作爲arguement到我的控制器:

public TunaController(IFishRepository repo ... 

所以我的問題是什麼的最佳方式來配置我的ObjectFactory?

回答

0

登記時命名實例,不應該是你使用Add方法的默認實例:

x.For<IFishRepository>() 
    .Add(() => new TunaRepository(serviceEndpoint)) 
    .Named("Tuna"); 

還觀察到,除非你想在TunaRepository是一個單身,你應該使用Lambda註冊。 lambda將在請求實例時進行評估,並在我的示例中返回一個新實例。小心使用serviceEndpoint,並確保是否需要所有存儲庫的單個實例。一般來說,我傾向於使用For <>()將所有依賴連接起來,在可能的地方使用<>(),而不是使用「new」。這樣做會使架構更加靈活,特別是因爲您可以在不更改註冊的情況下向ctors添加新參數。

用於指定命名實例在構造函數中使用,你可以使用這個語法:

x.For<TunaController>().Use<TunaController>(). 
    Ctor<IFishRepository>("repo"). 
    Is(i => i.TheInstanceNamed("Tuna")); 

由於所有的註冊都遵循同樣的模式,我會爲了使用IRegistrationConvention刪除重複代碼,儘量減少添加新存儲庫的工作量。

+0

感謝您的信息。 (lambda參數有一個輸入arg雖然:)) – Dve 2011-05-17 08:58:59