2016-03-21 62 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实现中存储并处理适当的容器。