Simple Injector初始化MVC和Web API控制器

Fai*_*est 13 c# asp.net-mvc dependency-injection simple-injector

我有一个Web API控制器,它有一些资源DI'd.出于后来的需要,我添加了一个MVC控制器,现在我也需要相同的资源DI'd.这是我的原始配置:

    [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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在同一个地方为MVC Controller注册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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 14

我可以重复使用容器吗?

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

Simple Injector文档的MVC集成文档说明您应该DependencyResolver按如下方式设置MVC :

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)

为了方便起见,你应该注册WebRequestLifestyleDefaultScopedLifestyle:

container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
Run Code Online (Sandbox Code Playgroud)

这也适用于Web API,因为您只从IIS中运行Web API.

因此,您需要配置DependencyResolvers.

  • 我完全理解,我们应该使用`.RegisterMvcControllers()`和`RegisterWebApiControlers()`以及_both_`System.Web.Mvc.DependencyResolver(new SimpleInjectorDependencyResolver(container))`_and_`GlobalConfiguration.Configuration.DependencyResolver(新的SimpleInjectorWebApiDependencyResolver(容器))`? (5认同)
  • @ Dr.Zim:如果你同时使用Web API和MVC:是的. (2认同)