C# 除了在应用程序变量中存储DI容器引用,还有其他选择吗?
我有一个C#MVC应用程序。我正在使用Unity容器来解决依赖关系。对于在MVC控制器中注入依赖项,我使用构造函数注入。为了实现这一点,我在应用程序启动事件上用我的Controller Builder工厂替换了MVC Controller Builder工厂,即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
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
中吗?