Simple injector with a few restricted DbContexts - exception "IDbContext already registered"

I am trying to switch to Simple Injector because I am impressed with its speed.

 private static void RegisterServices(Container container)
 {
     container.RegisterPerWebRequest<IDbContext, DbContext1>();
     ////container.RegisterPerWebRequest<IDbContext, DbContext2>();    
     container.RegisterPerWebRequest<IUnitOfWork, UnitOfWork>();
     container.RegisterPerWebRequest<IColourRepository, ColourRepository>();

where DbContext1 and DbContext2 inherit from the BaseDbContext class

public class BaseDbContext<TContext> : DbContext, IDbContext where TContext : DbContext

which implements a fairly simple IDbContext interface (for example, many of those proposed in SO), for example:

public interface IDbContext
{
    IQueryable<TEntity> Find<TEntity>() where TEntity : class;
    DbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveChanges();
    void Dispose();
}

If I use only one DbContext class, it works fine - repositories are entered, data is pulled, etc.

However, I would also like to use limited contexts with fewer DbSets in each of them ( Shrink EF Models with a limited DDD context ), since my Code-First DbContext would otherwise include hundreds of classes

private static void RegisterServices(Container container)
 {
     container.RegisterPerWebRequest<IDbContext, DbContext1>();
     container.RegisterPerWebRequest<IDbContext, DbContext2>();

     container.RegisterPerWebRequest<IUnitOfWork, UnitOfWork>();
     container.RegisterPerWebRequest<IColourRepository, ColourRepository>();

Then I get an exception:

System.InvalidOperationException   HResult = -2146233079   Message = IDbContext . , Container.Options.AllowOverridingRegistrations true.    = SimpleInjector    :         SimpleInjector.Container.ThrowWhenTypeAlreadyRegistered( )         SimpleInjector.Container.AddRegistration( serviceType, )         SimpleInjector.Container.Register [TService, TImplementation] ( , String serviceTypeParamName, String implementationTypeParamName)         SimpleInjector.Container.Register [TService, TImplementation] ( )         SimpleInjector.SimpleInjectorWebExtensions.RegisterPerWebRequest [TService, TImplementation] ( )

:

container.Options.AllowOverridingRegistrations = true;

DbContext2, , DbContext1, . DbSet "" DbContext1, :

Additional information: The entity type Colour is not part of the model for the current context.

Simple Injector DbContexts ?

[]

DbContexts , , Simple 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 - , ?

https://simpleinjector.org/

+4
1

ColourRepository DbContext1, DbContext2 ( )

. IDbContext, , , ( ), , . , DI ( ).

, , , . :

public class ColourRepository : Repository<Colour>, IColourRepository
{
    public ColourRepository(ICustomerDbContext context) : base(context) { }
}

:

container.Register<IDbContext, NorthwindContext>(Lifestyle.Scoped);
container.Register<ICustomerDbContext, NorthwindCustomerContext>(Lifestyle.Scoped);

, ; - , , DI .

+5

All Articles