Не могу создать контроллер, внедрение зависимости - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующий файл запуска (Startup.cs):

public void Configuration(IAppBuilder app)
{


    AutofacConfig.RegisterIoc();
    HttpConfiguration config = new HttpConfiguration();

    ConfigureOAuth(app); //This must come first before we load the WebApiConfig below.

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);

}

Как видите, я регистрирую конфигурацию autofac.Код для моей конфигурации autofac выглядит следующим образом: (AutofacConfig.cs)

 public class AutofacConfig
    {
        public static void RegisterIoc()
        {
            var builder = GetBuilder();
            var container = builder.Build();

            // Set dependency resolver for MVC
            //DependencyResolver.SetResolver(new AutofacWebApiDependencyResolver(container));

            // Set dependency resolver for Web API
            GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }

        public static ContainerBuilder GetBuilder()
        {
            var builder = new ContainerBuilder();
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            //builder.RegisterFilterProvider();


            var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(x => x.FullName.Contains("API")).ToArray();
            builder.RegisterAssemblyTypes(assemblies)
                .AsImplementedInterfaces()
                .InstancePerRequest();

            return builder;
        }
    }

Но когда я запускаю свое приложение и пытаюсь получить доступ к методу в моем контроллере, я получаю следующую ошибку:

Произошла ошибка при попытке создать контроллер типа 'DataController'.Убедитесь, что в контроллере есть открытый конструктор без параметров.

Я пытался отладить файл startup.cs либо для проверки его выполнения, и для этого.

До того, как я началзарегистрировать autofac в Global.asax, но поскольку я использую OAuth, я перешел из Global.asax и вместо этого создал файл запуска.Я думаю, это как-то связано с этим?

Мой контроллер выглядит так:

private readonly IItemModelService _itemModelService;

public DataController(IItemModelService itemModelService)
{
    this._itemModelService = itemModelService;
}

Stacktrace:

на System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, тип controllerType) в System.Web.Http.Controllers.HttpControllerDescriptor..Expressions.Expression.New (Тип type) в System.Web.Http.Internal.TypeActivator.Create [TBase] (Type instanceType) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (запрос HttpRequestMessage)1 & активатор) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, тип controllerType)

1 Ответ

0 голосов
/ 28 августа 2018

Я использую Oauth с OWIN, и я не знал, что это была специальная реализация autofac для приложения на основе owin.

Мой startup.cs выглядит следующим образом и работает:

public void Configuration(IAppBuilder app)
    {
        var builder = new ContainerBuilder();


        //AutofacConfig.RegisterIoc();
        HttpConfiguration config = new HttpConfiguration();

        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(x => x.FullName.Contains("API")).ToArray();
        builder.RegisterAssemblyTypes(assemblies)
            .AsImplementedInterfaces()
            .InstancePerRequest();

        var container = builder.Build();
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        ConfigureOAuth(app); //This must come first before we load the WebApiConfig below.

        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);
        app.UseWebApi(config);

    }

Я перешел по этим ссылкам:

https://autofaccn.readthedocs.io/en/latest/integration/webapi.html#owin-integration

https://autofaccn.readthedocs.io/en/latest/integration/owin.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...