SimpleInjector:注射不会MVC 4的ASP.NET Web API工作(SimpleI

2019-06-26 01:44发布

我有这样的设置:

public static void Initialize(ISessionFactory factory)
{
    var container = new Container();
    InitializeContainer(container, factory);
    container.RegisterMvcControllers(
        Assembly.GetExecutingAssembly());
    container.RegisterMvcAttributeFilterProvider();
    container.Verify();
    DependencyResolver.SetResolver(
        new SimpleInjectorDependencyResolver(container));
}

private static void InitializeContainer(
    Container container, ISessionFactory factory)
{
    container.RegisterPerWebRequest<ISession>(
        () => factory.OpenSession(), true);
}

初始化方法被调用Application_Start

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {
        SimpleInjectorInitializer.Initialize(
            new NHibernateHelper(
                Assembly.GetCallingAssembly(), 
                this.Server.MapPath("/"))
                .SessionFactory);

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

但是,当我尝试调用控制器动作,我得到一个ArgumentException

键入“PositionReportApi.Controllers.PositionsController”没有默认构造函数

堆栈跟踪:

在System.Linq.Expressions.Expression.New(类型类型)在System.Web.Http.Internal.TypeActivator.Create [TBASE](类型instanceType)在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)

我无法注册ISession

我如何注册由一个工厂创建一个ISession?

Answer 1:

从堆栈跟踪我可以看到你正在使用新的.NET 4.5的ASP.NET Web API和简单的喷油器是不是在介绍调用图。 这可能意味着你没有配置为与新的Web API,这是一个不同的注册比你需要的MVC使用简单注射器(对于一些奇怪的原因,我衷心希望他们解决这个问题的最终版本)。 既然你没有注册一个简单的注射器具体System.Web.Http.Dependencies.IDependencyResolver落实到Web API的GlobalConfiguration.Configuration.DependencyResolver ,你会得到默认的行为,这将只使用默认的构造函数工作。

看看这个答案#1 是否简单喷油器支持MVC 4的ASP.NET Web API? 来看看如何配置简单喷油器与新的ASP.NET Web API。

UPDATE

需要注意的是,你可以得到这个例外, 甚至如果您配置DependencyResolver正确的,但是当你没有注册登记明确您的Web API控制器。 这是由单向Web API的设计造成的。

始终明确注册您的控制器。



文章来源: SimpleInjector: Injection does not work with MVC 4 ASP.NET Web API