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<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/