2012-04-02 41 views
2

我使用Ninject廠擴展和創建一個自定義實例提供在維基解釋我已經創建了以下綁定:Ninject廠自定義實例提供

kernel.Bind<IFooFactory>().ToFactory(() => new UseFirstArgumentAsNameInstanceProvider()); 
kernel.Bind<IFoo>().To<FooBar>().Named("Foo"); 

現在,當我打電話給以下時,我將獲得一個實例FooBar

var foobar = fooFactory.NewFoo("Foo"); 

這一切都很好。什麼不過,我想是的東西多一點這樣的:

interface IFooTemplateRepository 
{ 
    Template GetTemplate(string template); 
} 

我有一個倉庫,將帶回基於名稱(「富」)一個模板,我想通過模板的構造函數參數。

public class FooBar 
{ 
    public FooBar(Template template) 
    { 
    } 
} 

這可能嗎?我不知道什麼應該有依賴於ITemplateRepository。

回答

1

請勿使用IoC容器來創建實體的實例。這是商業邏輯,因此它不屬於組合根。處理此問題的正確方法是直接使用ORM(例如,使用您正在使用的存儲庫模式)。

var template = this.templateRepository.Get("SomeTemplate"); 
var fooBar = this.fooBarFactory.CreateFooBar(template); 
+0

我覺得我是在過度推銷它。我大概可以創建一個自定義提供程序,將第一個參數轉換爲模板並檢查其上的屬性以確定要創建的命名實例。 – Dismissile 2012-04-03 13:52:03

相關問題