MVC 和 Web API 控制器的简单注入器初始化
Simple Injector initialize for both MVC and Web API controllers
我有一个 Web API 控制器,它有一些资源 DI。出于以后的需要,我添加了一个 MVC 控制器,现在我也需要在那里 DI 的相同资源。这是我的原始配置:
[assembly: WebActivator.PostApplicationStartMethod(typeof(CineplexSearch.App_Start.SimpleInjectorWebApiInitializer), "Initialize")]
namespace CineplexSearch.App_Start
{
using System.Web.Http;
using SimpleInjector;
using SimpleInjector.Integration.WebApi;
public static class SimpleInjectorWebApiInitializer
{
/// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
private static void InitializeContainer(Container container)
{
container.Register<ICachingManager, CachingManager>(Lifestyle.Transient);
container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient);
}
}
}
我也可以在同一个地方为 MVC 控制器注册 DI 吗?我可以重复使用容器吗?
更新: 我一定很接近,但现在我在 Web API 控制器中收到一个错误,我需要一个无参数的构造函数;我尝试添加它,但当然没有注入任何东西
public static class SimpleInjectorWebApiInitializer
{
/// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
//GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<ICachingManager, CachingManager>(Lifestyle.Transient);
container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient);
}
}
Can I reuse the container?
是的,你可以,而且你应该这样做。每个应用程序域通常应该有一个容器实例。
Simple Injector 文档的 MVC integration documentation 说明您应该按如下方式设置 MVC DependencyResolver
:
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
然而,为了使事情更简单,您应该将 WebRequestLifestyle
注册为 DefaultScopedLifestyle
:
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
这也适用于 Web API,因为您只是来自 IIS 中的 运行 Web API。
因此您需要同时配置 DependencyResolver。
我想补充两分钱,因为在阅读了史蒂文的回答和下面的评论后,我仍然有一些错误。最终这与配置事物的顺序有关。
protected void Application_Start()
{
//set the default scoped lifestyle
Container container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
...
//do class registration here. I did it with Scoped lifestyle
...
//Let the SimpleInjector.Intergration packages register the controllers.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
AreaRegistration.RegisterAllAreas();
//This must be here because we first need to do above before registering the web api. See WebApiConfig code.
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//don't set the resolver here, do it in WebApiConfig.Register()
//DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
container.Verify(SimpleInjector.VerificationOption.VerifyAndDiagnose);
}
WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
//set the webApi resolver here!
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(DependencyInjectionCoreSetup._Container);
//then the rest..
var route = config.Routes.MapHttpRoute(
....
}
}
另请注意,WebRequestLifestyle()
当时已过时。
您可以改用:
//...
container.Options.DefaultScopedLifestyle = new SimpleInjector.Lifestyles.AsyncScopedLifestyle();
//...
我有一个 Web API 控制器,它有一些资源 DI。出于以后的需要,我添加了一个 MVC 控制器,现在我也需要在那里 DI 的相同资源。这是我的原始配置:
[assembly: WebActivator.PostApplicationStartMethod(typeof(CineplexSearch.App_Start.SimpleInjectorWebApiInitializer), "Initialize")]
namespace CineplexSearch.App_Start
{
using System.Web.Http;
using SimpleInjector;
using SimpleInjector.Integration.WebApi;
public static class SimpleInjectorWebApiInitializer
{
/// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
private static void InitializeContainer(Container container)
{
container.Register<ICachingManager, CachingManager>(Lifestyle.Transient);
container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient);
}
}
}
我也可以在同一个地方为 MVC 控制器注册 DI 吗?我可以重复使用容器吗?
更新: 我一定很接近,但现在我在 Web API 控制器中收到一个错误,我需要一个无参数的构造函数;我尝试添加它,但当然没有注入任何东西
public static class SimpleInjectorWebApiInitializer
{
/// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
InitializeContainer(container);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
//GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<ICachingManager, CachingManager>(Lifestyle.Transient);
container.Register<IDataAccessLayer, DataAccessLayer>(Lifestyle.Transient);
}
}
Can I reuse the container?
是的,你可以,而且你应该这样做。每个应用程序域通常应该有一个容器实例。
Simple Injector 文档的 MVC integration documentation 说明您应该按如下方式设置 MVC DependencyResolver
:
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
然而,为了使事情更简单,您应该将 WebRequestLifestyle
注册为 DefaultScopedLifestyle
:
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
这也适用于 Web API,因为您只是来自 IIS 中的 运行 Web API。
因此您需要同时配置 DependencyResolver。
我想补充两分钱,因为在阅读了史蒂文的回答和下面的评论后,我仍然有一些错误。最终这与配置事物的顺序有关。
protected void Application_Start()
{
//set the default scoped lifestyle
Container container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
...
//do class registration here. I did it with Scoped lifestyle
...
//Let the SimpleInjector.Intergration packages register the controllers.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
AreaRegistration.RegisterAllAreas();
//This must be here because we first need to do above before registering the web api. See WebApiConfig code.
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//don't set the resolver here, do it in WebApiConfig.Register()
//DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
container.Verify(SimpleInjector.VerificationOption.VerifyAndDiagnose);
}
WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
//set the webApi resolver here!
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(DependencyInjectionCoreSetup._Container);
//then the rest..
var route = config.Routes.MapHttpRoute(
....
}
}
另请注意,WebRequestLifestyle()
当时已过时。
您可以改用:
//...
container.Options.DefaultScopedLifestyle = new SimpleInjector.Lifestyles.AsyncScopedLifestyle();
//...