3

我有这个设置:

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

Initialize 方法在以下位置调用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(Type type) 在 System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor控制器描述符,类型控制器类型)

我无法注册ISession.

如何注册由工厂创建的 ISession?

4

1 回答 1

6

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

看看这个 Stackoverflow 答案Simple Injector 是否支持 MVC 4 ASP.NET Web API?了解如何使用新的 ASP.NET Web API 配置 Simple Injector。

更新

Note that you can get this exception even if you configured the DependencyResolver correctly, but when you didn't register register your Web API Controllers explicitly. This is caused by the way Web API is designed.

Always register your Controllers explicitly.

于 2012-07-05T17:02:36.477 回答