我有这个设置:
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/