Автозапуск модуля регистрации в 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);