2015-12-16 29 views
0

我是使用Autofac的新手,很抱歉,如果這是一個愚蠢的問題。不帶參數的Autofac工廠實例化

假設我有一個具有無參數構造函數的抽象類FooBase,以及一個名爲Foo的實現。在我的AP.Net MVC5客戶端代碼中,我希望能夠創建一個FooBase類型的對象(我已經設置Autofac將其解析爲Foo)的一個實例。這個實例的生命週期和範圍僅限於我的方法,我想以類似於調用工廠方法的方式來做到這一點。

目前我正在使用DependencyResolver,但它似乎有點做作。有沒有更簡單的方法來做到這一點?

例如,這裏是它目前看起來像......

public void SendMessage() 
{ 
    var foo = DependencyResolver.Current.GetService<FooBase>(); 
    Debug.WriteLine(foo.Name); 
} 

我要尋找的東西多一點這樣的...

public void SendMessage() 
{ 
    var foo = IoC.Resolve<FooBase>(); 
    Debug.WriteLine(foo.Name); 
} 
+0

你不能簡單地添加一個'Resolve'泛型方法到你的'DependencyResolver'類反過來說'this.Current.GetService <...>()'?另一方面,你是不是可以在你的類的構造函數中注入'Foo'?這將使您不必使用'ServiceLocator'模式,這意味着您不必在方法中間調用'GetService',因爲您的所有依賴關係都將在構建類之前解決? –

+0

嗨。不,不幸的是,在這種情況下,建築商注入或財產注入都不合適。該類包含運行時邏輯,該邏輯決定何時應該實例化類的新實例或何時應該從其他地方「提取」現有版本。 –

+0

@StephenRoss我試圖找出Autofac是否已經有了一些標準的方法來做到這一點,然後再滾動我自己的。 –

回答

0

而不是使用服務定位器which is an anti-pattern,你可以簡單地注入一個工廠,允許你創建一個依賴關係的實例,如果/當你想要。最簡單的方法是注入Func<FooBase>。 Autofac supports this natively。如果您只註冊FooBase,AutoFac會知道如何注入Func<FooBase>。這裏有一個例子:

public class TestClass 
{ 
    private Func<FooBase> m_FooBaseFactory; 

    public TestClass(Func<FooBase> factory) 
    { 
     m_FooBaseFactory = factory; 
    } 

    public void TestMethod() 
    { 
     var foo = m_FooBaseFactory(); 
     //consume foo here 
    } 
} 
+0

我更喜歡這種方法,因爲它不需要我在我的服務組件中創建委託。對於將來閱讀此內容的任何人,這種關於隱式關係類型的參考也非常方便http://docs.autofac.org/en/latest/resolve/relationships.html –

2

我認爲你可以使用delegate factories

首先聲明您想要在運行時構建的類型的代理工廠:

public class TestService 
{ 
    public delegate TestService Factory(); 
    //other methods.... 
} 

然後你可以注入的工廠與任何其他的依賴,例如:

public class ExampleController 
{ 
    private TestService.Factory _factory; 
    public ExampleController(TestService.Factory factory)     
    { 
     _factory = factory; 
    } 

    public OtherMethod() 
    { 
     var serviceInstance = _factory(); 
    } 
} 

希望這有助於!

+0

這是去+1的方法。但是,使用'Func '的(IMO)更容易。 –