nhibernate - SimpleInjector : Injection does not work with MVC 4 ASP. NET Web API

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

但是当我尝试调用 Controller 操作时,我得到了一个ArgumentException:

Type 'PositionReportApi.Controllers.PositionsController' does not have a default constructor

堆栈跟踪:

at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

我无法注册 ISession

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

最佳答案

从堆栈跟踪中我可以看到您正在使用新的 .NET 4.5 ASP.NET Web API,并且简单注入(inject)器不在提供的调用图中。这可能意味着您还没有配置简单注入(inject)器以与新的 Web API 一起使用,这与 MVC 所需的注册不同(出于某些奇怪的原因,我真诚地希望他们在最终版本中修复此问题)。由于您没有将特定于简单注入(inject)器的 System.Web.Http.DependencyResolver 实现注册到 Web API 的 GlobalConfiguration.Configuration.DependencyResolver,您将获得默认值行为,仅适用于默认构造函数。

看看这个 Stackoverflow 答案 Does Simple Injector supports MVC 4 ASP.NET Web API?查看如何使用新的 ASP.NET Web API 配置简单注入(inject)器。

更新

请注意,如果您正确配置了 DependencyResolver,但您没有显式注册您的 Web API Controller ,您甚至可能会遇到此异常。这是由 Web API 的设计方式引起的。

始终明确注册您的 Controller 。

关于nhibernate - SimpleInjector : Injection does not work with MVC 4 ASP. NET Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347152/

相关文章:

php - 如何检查 MYSQL 查询中定义的偏移量

c# - 如何从配置文件加载统一设置?

c# - 如何使用流畅的 nhibernate 自动映射在同一个表中引用父实体?

c# - NHibernate Group By 父实体没有 N+1 查询?

c# - NHibernate 延迟加载但没有虚拟属性?

NHibernate - 选择的最佳实践

c# - 在 asp.net 中从母版页获取值到子页

javascript - Express session 在发送后无法使用 "Error: Can' t 设置 header 。”

c# - 如何通过具体类型而不是接口(interface)类型获取注册服务?

扩展类中的PHP依赖注入(inject)