Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除了在应用程序变量中存储DI容器引用,还有其他选择吗?_C#_Asp.net Mvc_Dependency Injection_Unity Container - Fatal编程技术网

C# 除了在应用程序变量中存储DI容器引用,还有其他选择吗?

C# 除了在应用程序变量中存储DI容器引用,还有其他选择吗?,c#,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net Mvc,Dependency Injection,Unity Container,我有一个C#MVC应用程序。我正在使用Unity容器来解决依赖关系。对于在MVC控制器中注入依赖项,我使用构造函数注入。为了实现这一点,我在应用程序启动事件上用我的Controller Builder工厂替换了MVC Controller Builder工厂,即 protected void Application_Start() { IUnityContainer container = new UnityContainer(); //All container registr

我有一个C#MVC应用程序。我正在使用Unity容器来解决依赖关系。对于在MVC控制器中注入依赖项,我使用构造函数注入。为了实现这一点,我在应用程序启动事件上用我的Controller Builder工厂替换了MVC Controller Builder工厂,即

protected void Application_Start() 
{    
 IUnityContainer container = new UnityContainer();

 //All container registrations ....

ControllerBuilder.Current.SetControllerFactory(new 
UnityControllerFactory(container)); 

//Store reference of container in application object
HttpContext.Current.Application["Injector"] = container;   
}
然而,我需要容器的实例来解决某些地方的依赖关系,在这些地方不可能进行构造函数注入,例如,Application_AuthenticateRequest事件。因此,作为回退,我在应用程序对象中存储了对容器的引用。我使用此实例解析引用

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
 var container = HttpContext.Current.Application["Injector"] as 
 IUnityContainer;
 var service = container.Resolve<IService>();
}
受保护的无效应用程序\u AuthenticateRequest(对象发送方,事件参数e)
{
var container=HttpContext.Current.Application[“Injector”]as
IUnityContainer;
var service=container.Resolve();
}
是否可以将容器引用存储在应用程序变量中,或者是否有其他推荐做法? 我也知道有财产注入。我可以在这个场景中使用它吗?

我们有一个应用程序,在
应用程序_Start()
中,我们通过
全局配置。配置([…])
,但我想您可以通过其他方式配置解析器:

public static void Register(HttpConfiguration config)
{   
    UnityContainer container = new UnityContainer();

    // This contains our actual container registrations.    
    UnityRegistrer.Register(container); 

    // IoC for WebAPI
    config.DependencyResolver = new UnityResolver(container);

    // IoC for WebForms
    HttpContext.Current.Application.SetContainer(container);

    // IoC for MVC5
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));

    // Configure other stuff like routes, tracing, error handling, authorization, etc.
}

我不是一般的Web开发专家,所以也许你想调整一些东西,但这对我们来说很好。

你应该努力防止从应用程序代码中访问容器。但是,在容器中,直接访问容器通常是可以的,而且通常无法防止这种情况发生。您的
应用程序\u AuthenticateRequest
可以被视为组合根的一部分,因此可以访问容器(实际上没有办法)

但是,您可以将代码简化为以下内容:

private static IUnityContainer container;

protected void Application_Start() 
{    
    container = new UnityContainer();

    ...
}

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    var service = container.Resolve<IService>();
}
私有静态IUnityContainer容器;
受保护的无效应用程序\u Start()
{    
容器=新的UnityContainer();
...
}
受保护的无效应用程序\u AuthenticateRequest(对象发送方,事件参数e)
{
var service=container.Resolve();
}

我对Unity尤其不熟悉,但DI容器通常都有一种访问容器单例的方法。查看有关如何手动获取容器实例的容器文档。@ChrisPratt:这实际上根本不是“DI容器的常见情况”。我记得唯一允许这样做的库是StructureMap,但在以后的版本中,他们不推荐使用允许对单个容器实例使用静态访问器的API。您能将其作为全局应用程序类的属性而不是存储在
HttpContext.Current.Application
中吗?