C# MVC和Web API控制器的简单注入器初始化

C# MVC和Web API控制器的简单注入器初始化,c#,asp.net-mvc,dependency-injection,simple-injector,C#,Asp.net Mvc,Dependency Injection,Simple Injector,我有一个Web API控制器,它有一些资源。出于以后的需要,我添加了一个MVC控制器,现在我也需要同样的资源。以下是我的原始配置: [assembly: WebActivator.PostApplicationStartMethod(typeof(CineplexSearch.App_Start.SimpleInjectorWebApiInitializer), "Initialize")] namespace CineplexSearch.App_Start { using

我有一个Web API控制器,它有一些资源。出于以后的需要,我添加了一个MVC控制器,现在我也需要同样的资源。以下是我的原始配置:

    [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);
        }
    }
}
[程序集:WebActivator.PostApplicationStartMethod(typeof(CineplexSearch.App\u Start.SimpleInjectorWebAPInitializer),“初始化”)]
名称空间CineplexSearch.App\u启动
{
使用System.Web.Http;
使用SimpleInjector;
使用SimpleInjector.Integration.WebApi;
公共静态类SimpleInjectorWebApiInitializer
{
///初始化容器并将其注册为Web API依赖项解析器。
公共静态void Initialize()
{
var container=新容器();
container.Options.DefaultScopedLifestyle=新的WebApiRequestLifestyle();
初始化容器(容器);
容器.RegisterWebApp控制器(全局配置.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver=
新的SimpleInjectorWebApidencyResolver(容器);
}
私有静态void InitializeContainer(容器)
{
容器。寄存器(生活方式。瞬态);
容器。寄存器(生活方式。瞬态);
}
}
}
我可以在同一个地方为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);
    }
}
公共静态类SimpleInjectorWebAPI初始值设定项
{
///初始化容器并将其注册为Web API依赖项解析器。
公共静态void Initialize()
{
var container=新容器();
container.Options.DefaultScopedLifestyle=新的WebRequestLifestyle();
初始化容器(容器);
容器.RegisterWebApp控制器(全局配置.Configuration);
container.RegisterMvcControllers(Assembly.getExecutionGassembly());
container.Verify();
//GlobalConfiguration.Configuration.DependencyResolver=新的SimpleInjectorWebAPI DependencyResolver(容器);
SetResolver(新的SimpleInjectDependencyResolver(容器));
}
私有静态void InitializeContainer(容器)
{
容器。寄存器(生活方式。瞬态);
容器。寄存器(生活方式。瞬态);
}
}
我可以重复使用这个容器吗

是的,你可以,你应该。每个应用程序域通常应该有一个容器实例

简单喷油器文档的第页解释了您应该按如下方式设置MVC
DependencyResolver

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
但是,为了简化操作,您应该将
WebRequestLifestyle
注册为
DefaultScopedLifestyle

container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
这也适用于Web API,因为您只在IIS中运行Web API


因此,您需要配置两个DependencyResolver。

我想加上我的两分钱,因为在阅读了Steven的答案和下面的评论之后,我仍然会遇到一些错误。最终,这与配置的顺序有关

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();

//...

感谢您的快速回复,我几乎可以正常工作了,您可以查看我的更新吗?@failedunitest您需要两个依赖项解析程序。所以Web API依赖项解析程序也是如此。我完全理解,我们应该同时使用
.RegisterMvcControllers()
registerWebAppicontrollers()
以及
System.Web.Mvc.DependencyResolver(新的SimpleInjectDependencyResolver(容器))
全局配置.Configuration.DependencyResolver(新的SimpleInjectorWebAPI DependencyResolver(容器))
?@Dr.Zim:如果您同时使用Web API和MVC:是。谢谢@Dr.Zim。通过你的评论,我理解了整个答案。DependencyInjectionCoreSetup?WebRequestLifestyle(bool)已经过时了。WebRequestLifestyle()不是过时的。建议在仅包含Web API(或其他异步技术,如ASP.NET Core)的应用程序中使用AsyncScopedLifestyle,并在包含Web API和MVC混合的应用程序中使用WebRequestLifestyle。