Регистрация класса по нескольким абстракциям при создании типа вручную - PullRequest
0 голосов
/ 12 октября 2018

Я хочу зарегистрировать класс Foo и его интерфейс IBar.

var b = new DbContextOptionsBuilder();
b.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=Connect.Device;Trusted_Connection = True; MultipleActiveResultSets = true;");
_container.Register(() => new DeviceContext(b.Options), Lifestyle.Scoped);
_container.Register<IFoo, DeviceContext>(Lifestyle.Scoped);
_container.Register<IDeviceTypeService, DeviceTypeService>(Lifestyle.Scoped);

Это не работает.Это исключение, которое выдается при вызове Verify:

System.InvalidOperationException HResult = 0x80131509 Сообщение = недопустимая конфигурация.Не удалось создать экземпляр для типа IFoo.Конструктор типа DeviceContext содержит параметр с именем 'options' и типом DbContextOptions, который не зарегистрирован.Убедитесь, что DbContextOptions зарегистрирован, или измените конструктор DeviceContext.Source = SimpleInjector StackTrace: в SimpleInjector.InstanceProducer.VerifyExpressionBuilding () в SimpleInjector.Container.VerifyThatAllExpressionsCanBeBuilt (InstanceProducer [] sourcesToVerify) в SimpleInjector.Container.Verilt.erer.IverInerer.IverVerОпция VerificationOption) в Connect.Device.Service.Startup.InitializeContainer (приложение IApplicationBuilder) в Startup.cs: строка 85 в Connect.Device.Service.Startup.Configure (приложение IApplicationBuilder, IHostingEnvironment env) в Startup.cs: строка 50

Внутреннее исключение 1: ActivationException: конструктор типа DeviceContext содержит параметр с именем 'options' и типом DbContextOptions, который не зарегистрирован.Убедитесь, что DbContextOptions зарегистрирован, или измените конструктор DeviceContext.

1 Ответ

0 голосов
/ 12 октября 2018

При регистрации с использованием Register<TService, TImplementation> (например, вашего Register<IFoo, DeviceContext>) всегда используется автоматическое подключение путем анализа конструктора типа.Он не будет возвращаться к предыдущей регистрации для этого типа.

Вы хотите перезаписать автоматическое подключение и ручной провод DeviceContext, в то же время имея возможность разрешить его несколькими типами.Способ достижения этого заключается в следующем:

var reg = Lifestyle.Scoped.CreateRegistration(
    () => new DeviceContext(b.Options), container);
container.AddRegistration<DeviceContext>(reg);
container.AddRegistration<IFoo>(reg);

Здесь вы создаете экземпляр Registration для DeviceContext, который позволяет вручную связывать тип с указанием его стиля жизни.Это, однако, не регистрирует его, что можно сделать, вызвав AddRegistration, указав тип, для которого оно может быть разрешено.

...