Я пытаюсь переключиться на Простой инжектор Инъекционная система зависимости, поскольку меня впечатляет ее скорость.Простой инжектор с несколькими ограниченными DbContexts - исключение «IDbContext уже зарегистрирован»
private static void RegisterServices(Container container)
{
container.RegisterPerWebRequest<IDbContext, DbContext1>();
////container.RegisterPerWebRequest<IDbContext, DbContext2>();
container.RegisterPerWebRequest<IUnitOfWork, UnitOfWork>();
container.RegisterPerWebRequest<IColourRepository, ColourRepository>();
где DbContext1 и DbContext2 наследовать от класса BaseDbContext
public class BaseDbContext<TContext> : DbContext, IDbContext where TContext : DbContext
который реализует довольно простой интерфейс IDbContext (как многие предлагали на SO), например:
public interface IDbContext
{
IQueryable<TEntity> Find<TEntity>() where TEntity : class;
DbSet<TEntity> Set<TEntity>() where TEntity : class;
int SaveChanges();
void Dispose();
}
Если я используйте только один класс DbContext, он отлично работает - хранилища вводятся, данные вытягиваются и т. д.
Однако, я хотел бы также использовать ограниченные контексты с меньшим числом DbSets в каждом из них (Shrink EF Models with DDD Bounded Contexts), как мой код-первых DbContext иначе включает бы сотни классов
private static void RegisterServices(Container container)
{
container.RegisterPerWebRequest<IDbContext, DbContext1>();
container.RegisterPerWebRequest<IDbContext, DbContext2>();
container.RegisterPerWebRequest<IUnitOfWork, UnitOfWork>();
container.RegisterPerWebRequest<IColourRepository, ColourRepository>();
Тогда я получаю исключение:
System.InvalidOperationException был необработанным пользователем кодом HResult = -2146233079 Message = Тип IDbContext уже зарегистрирован и контейнер в настоящее время не настроен на разрешение перекрывая регистрацию. Чтобы разрешить отмену текущей регистрации, установите для параметра Container.Options.AllowOverridingRegistrations значение true. Источник = SimpleInjector StackTrace: в SimpleInjector.Container.ThrowWhenTypeAlreadyRegistered (тип Type) в SimpleInjector.Container.AddRegistration (тип ServiceType, регистрация регистрации) на SimpleInjector.Container.Register [TService, TImplementation] (Стиль жизни, образ жизни Струнный serviceTypeParamName , String implementationTypeParamName) на SimpleInjector.Container.Register [TService, TImplementation] (Стиль жизни образ жизни) на SimpleInjector.SimpleInjectorWebExtensions.RegisterPerWebRequest [TService, TImplementation] (Container контейнер)
Если я следовать предложению:
container.Options.AllowOverridingRegistrations = true;
, тогда DbContext2, кажется, переопределяет DbContext1, например. DbSet «Цвет» в DbContext1 и он не доступен больше:
Additional information: The entity type Colour is not part of the model for the current context.
Как следует использовать простой Инжектор и ограниченные DbContexts вместе?
[UPDATE]
В DbContexts которые не используются в контроллерах непосредственно, они являются зависимостями хранилищ, которые просто Injector должны иметь возможность инициализировать в конструкторах
public class ColoursController : ApiController
{
private readonly IColourRepository _repository;
private readonly ModelFactory _modelFactory;
public ColoursController(IColourRepository repository)
{
_repository = repository;
_modelFactory = new ModelFactory();
}
где
public class ColourRepository : Repository<Colour>, IColourRepository
{
public ColourRepository(IDbContext context) : base(context) { }
ColourRepository ожидает конкретной реализации DbContext1, но для некоторого другого репозитория потребуется DbContext2 (с другим набором объектов)
Я не вижу причины, по которой невозможно использовать интерфейс IDbContext (или базовый тип) для DbContext1 и DbContext2.
Единство может сделать это:
container.RegisterType<IDbContext, NorthwindContext>(new PerRequestLifetimeManager(), "NorthwindContext");
container.RegisterType<IDbContext, NorthwindCustomerContext>(new PerRequestLifetimeManager(), "NorthwindCustomerContext");
Ninject может это сделать.
Простые указатели на инжектор CompositeLogger - может быть, можно было бы сделать трюк?
Какое поведение вы ожидали? Когда вы делаете две регистрации для одного и того же типа, которые нужно вводить? Простой инжектор препятствует вам делать неоднозначную регистрацию и, следовательно, бросает. Чего вы пытаетесь достичь? Какую оспаривание нужно вводить при каких обстоятельствах? – Steven
Я хотел бы как-то зарегистрировать DbContext1 и DbContext2, поскольку они включают подмножества наборов данных. Они используются репозиториями, поэтому, когда я вставляю репозиторий в contructor: public ColoursController (репозиторий IColourRepository), я ожидаю, что он сможет использовать DbContext1. public class ColourRepository: репозиторий, IColourRepository {public ColourRepository (контекст IDbContext): base (context) {} –
AFD
@ADNow Вы попробовали это?var webLifestyle = новый WebRequestLifestyle(); container.Register (webLifestyle); container.Register (webLifestyle); –
Spock