Вопрос по registration, dependency-injection, session, nhibernate, simple-injector – SimpleInjector: внедрение не работает с MVC 4 ASP.NET Web API

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:

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, созданную фабрикой?

Ваш Ответ

1   ответ
6

что вы используете новый .NET 4.5 ASP.NET Web API, а Simple Injector отсутствует в представленном графе вызовов. Это, вероятно, означает, что вы не настроили Simple Injector для использования с новым Web API, который отличается от регистрации, которая вам необходима для MVC (по какой-то странной причине, и я искренне надеюсь, что они исправят это в окончательном выпуске). Поскольку вы не зарегистрировали Simple InjectorSystem.Web.Http.Dependencies.IDependencyResolver реализация к веб-APIGlobalConfiguration.Configuration.DependencyResolverвы получите поведение по умолчанию, которое будет работать только с конструкторами по умолчанию.

Посмотрите на этот ответ StackoverflowПоддерживает ли Simple Injector MVC 4 ASP.NET Web API? чтобы узнать, как настроить Simple Injector с новым веб-API ASP.NET.

UPDATE

Обратите внимание, что вы можете получить это исключениеeven если вы настроилиDependencyResolver правильно, но когда вы не зарегистрировали, зарегистрируйте свои контроллеры Web API явно. Это вызвано тем, как разработан веб-API.

Always register your Controllers explicitly.

Похожие вопросы