Автозапуск модуля регистрации в ASP.NET WebAPI

До сих пор я проводил регистрацию типов внутри класса в своем проекте MVC, но сейчас я пытаюсь сделать это с помощью модулей. Мой проект структурирован следующим образом

Project.Data: содержит мои классы управления объектами и DataContext. Я реорганизовал свой datacontect для реализации интерфейса (IDbContext), который я регистрирую через модуль автозапуска Project.Business: содержит классы бизнес-логики, в которые внедряется экземпляр IDbContext. Классы реализуют соответствующие интерфейсы, которые также регистрируются через модуль автозапуска Project.Web: проект asp.net, который использует сканирование сборки для регистрации всех модулей автозапуска

Образец кода

Project.Data

//IDbContext
public  interface IDbContext
{
    IDbSet<MyData> MyDatas { get; set; }
    ....
}

//DataContext
public class DataContext : DbContext, IDbContext
{
    public IDbSet<MyData> MyDatas { get; set; }
}

//Module
public class DataInjectionModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<DataContext>().As<IDbContext>();
    }
}

Project.Business

public interface IServeDataService
{
    IEnumerable<object> GetData();
}
public class ServeDataService : IServeDataService
{
    private IDbContext context;
    public ServeDataService()
    {
        this.context = context;
    }
    public IEnumerable<object> GetData()
    {
    }
}

public class BusinessInjectionModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ServeDataService>().As<IServeDataService>();
    }
}

Project.Web

public partial class Startup
{
     public void RegisterContainer()
     {
         var builder = new ContainerBuilder();

         var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
         builder.RegisterAssemblyModules(assemblies.ToArray());
         builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

         builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

     }
}

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        RegisterContainer();
    }
}

//controller
public class DataController : ApiController
{
    private IServeDataService dataService;
    public DataController(IServeDataService dataService)
    {
        this.dataService = dataService;
    }

    public async Task<IHttpActionResult> Get()
    {
        var data = dataService.GetData();
        return Ok(data);
    }
}

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

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

Я отладил и установил точки останова в метиде RegisterContainer, и он вызывается, я также посмотрел перечисленные сборки и перечислил мои сборки для бизнеса и данных, но регистрация моих модулей никогда не запускалась. Что я делаю неправильно?

1 ответ

Решение

Похоже, вы не настроили Web API для использования вашего контейнера Autofac.

Чтобы интегрировать Autofac с Web API, вам нужно сослаться на пакет NuGet интеграции Web API, зарегистрировать свои контроллеры и установить средство разрешения зависимостей. При желании вы также можете включить другие функции.
> Autofac - документация по веб-API.

Чтобы это работало, вы должны добавить ссылку на пакет Nuget Autofac ASP.NET Web API Integration и добавить следующую строку в ваш RegisterContainer метод:

// Set the dependency resolver to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
Другие вопросы по тегам