C# 集装箱放在哪里?

C# 集装箱放在哪里?,c#,.net,asp.net-mvc,inversion-of-control,dryioc,C#,.net,Asp.net Mvc,Inversion Of Control,Dryioc,我正在我的Web应用程序中试用IoC,并希望按照最佳实践进行操作。最近,我发现了一个名为DryIoc的IoC框架,它应该是小而快的 我已经通读了这些示例,但似乎没有人指出应该将容器本身放在哪里 它应该驻留在控制器中吗?还是在Global.asax中?也许去别的地方?或者作为类中的静态变量 如果有人能为我指引正确的方向,我将不胜感激,最好是使用一些示例代码,因为我已经陷入停顿,不知道如何继续 var container = new Container(); // Should obviousl

我正在我的Web应用程序中试用IoC,并希望按照最佳实践进行操作。最近,我发现了一个名为DryIoc的IoC框架,它应该是小而快的

我已经通读了这些示例,但似乎没有人指出应该将容器本身放在哪里

它应该驻留在控制器中吗?还是在Global.asax中?也许去别的地方?或者作为类中的静态变量

如果有人能为我指引正确的方向,我将不胜感激,最好是使用一些示例代码,因为我已经陷入停顿,不知道如何继续

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

container.Register<ISalesAgentRepository, SalesAgentRepository>(Reuse.Singleton);
var container=new container();//显然不应该是局部变量
容器.寄存器(重用.单例);

通常我会执行以下操作:

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>();
    }
}
不要在任何地方直接使用容器,您必须在MVC生命周期中的某个地方将其挂钩,通常您使用的DI包可以为您做到这一点


还要注意,我已经向引导程序类添加了一个
GetInstance
方法。这种方法使得通过请求类型的实例直接使用容器成为可能。我添加了这个方法,所以您知道这是可能的,但如果可能,请始终使用构造函数注入

实际上,您可能不需要将容器存储在您这边。这是你的电话号码


DryIoc.WebApi扩展将在IDependencyResolver实现中适当时存储和处置容器。

您需要在中使用容器。我建议您使用更广泛使用的容器来开始使用DI,因为您将发现更多支持、示例和工具。如果在您使用不同的容器之后,您决定尝试这些小型的、非传统的容器,那么您将有经验知道如何正确使用它们。与这里的其他评论和答案相反,我建议您。这样做的好处是,您可以更好地了解底层模式,并且不会遇到一些棘手的API问题。@MarkSeemann真的吗?与你的评论相反,我建议我们将所有内容返回给assembler请注意,许多IOC项目都为您提供了这种开箱即用的支持:尽管如果您使用StructureMap4,您需要调整MVC5包在解决方案中放置的2个文件Maartn您可以删除GetInstance方法吗请:)大多数使用新di的人他们会解决的。除此之外,您还可以使用一种方法返回新的lifetimescope。这正是我的做法,但我将利用WebActivator,而不是像我被迫那样污染global asax。
protected void Application_Start() {
    Bootstrapper.Bootstrap();
}