SimpleInjector:注入不适用于MVC 4 ASP.NET Web API

时间:2012-07-05 15:05:12

标签: nhibernate session dependency-injection registration simple-injector

我有这个设置:

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

中调用Initialize方法
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(Type type)at   System.Web.Http.Internal.TypeActivator.Create [TBASE](类型   instanceType)at   System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage   请求,HttpControllerDescriptor controllerDescriptor,Type   controllerType)

我无法注册ISession

如何注册工厂创建的ISession?

1 个答案:

答案 0 :(得分:6)

从堆栈跟踪中我可以看到您使用的是新的.NET 4.5 ASP.NET Web API,并且Simple Injector不在显示的调用图中。这可能意味着您尚未将Simple Injector配置为与新的Web API一起使用,这与您对MVC的需求不同(出于某些奇怪的原因,我真诚地希望他们在最终版本中解决此问题)。由于您没有向Web API的System.Web.Http.Dependencies.IDependencyResolver注册Simple Injector特定的GlobalConfiguration.Configuration.DependencyResolver实现,因此您将获得默认行为,该行为仅适用于默认构造函数。

查看此Stackoverflow答案Does Simple Injector supports MVC 4 ASP.NET Web API?,了解如何使用新的ASP.NET Web API配置Simple Injector。

<强>更新

请注意,如果正确配置了DependencyResolver,则可以获得此异常甚至,但是当您未注册时,请明确注册Web API控制器。这是由Web API的设计方式引起的。

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