2016-03-21 74 views
4

我在我的Web應用程序中使用IoC進行實驗,並希望根據最佳實踐進行操作。最近我發現了一個名爲DryIoc的IoC框架,它應該是小而快的。何處放置容器?

我已經讀過這些例子,但似乎沒有指出我應該放置容器本身。

它應該駐留在控制器中嗎?或者在Global.asax中?其他地方也許?或者也許作爲一個類的靜態變量?

如果有人能夠引導我朝着正確的方向發展,最好是使用一些示例代碼,因爲我停滯不前,並且不知道如何繼續,我會感激的。

var container = new Container(); // Should obviously NOT be a local variable 

container.Register<ISalesAgentRepository, SalesAgentRepository>(Reuse.Singleton); 
+2

您需要使用[合成根目錄](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)中的容器。 –

+1

我建議使用更廣泛使用的容器來開始使用DI,因爲您會發現更多的支持,示例和工具。如果在使用不同的容器之後,您決定嘗試使用這些小型,不受歡迎的容器,那麼您將有經驗知道如何正確使用它們。 –

+2

與其他評論和回答相反,我建議你[根本不要使用DI容器](http://blog.ploeh.dk/2014/06/10/pure-di)。這將有利於您更好地瞭解底層模式,並且不會陷入一些尷尬的API問題。 –

回答

2

通常我做到以下幾點:

1 - 創建一個引導程序類

public static class Bootstrapper { 
    public static Container _container; 
    public void Bootstrap() { 
     var container = new Container; 
     // TODO: Register all types 
     _container = container; 
    } 
    public static T GetInstance<T>() { 
     return _container.Resolve<T>(); 
    } 
} 

2 - 呼叫在Global.asax的引導方法,在Application_Start方法:

protected void Application_Start() { 
    Bootstrapper.Bootstrap(); 
} 

永遠不要直接在任何地方使用容器,你必須將它掛在MVC生命週期的某個地方,通常您使用的DI包可以爲您做到這一點。

另請注意,我已將GetInstance<T>方法添加到引導程序類。這種方法可以通過請求類型實例直接使用容器。我已經添加了這種方法,所以你知道這是可能的,但如果可能的話總是使用構造函數注入

+0

Maartn你可以刪除GetInstance方法:)大多數人誰新的迪他們將使用它,他們將從那裏解決它。除此之外,你可以放置一個返回新生命週期的方法。 –

+2

確切地說我是怎麼做到的,但我會利用WebActivator而不是污染全球的asax,而不是我不得已。 –

1

實際上,您可能不需要在您身邊存放容器。這裏是DryIoc WebApi Owin sample

DryIoc.WebApi擴展將在IDependencyResolver實現中存儲並處理適當的容器。