0

J'ai un projet et mon projet se connecte à deux bases de données différentes: BookStoreEntities et BlogEntities.Comment utiliser plusieurs bases de données avec Autofac?

Si je supprimer le code de ligne builder.RegisterType<BlogEntities>().As<DbContext>(); dans la configuration Autofac mon projet fonctionne très bien et d'autre je vais obtenir erreur « Le type d'entité livre ne fait pas partie du modèle pour le contexte actuel ».

Ma config autofac:

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.RegisterType<BookStoreEntities>().As<DbContext>(); 
builder.RegisterType<BlogEntities>().As<DbContext>(); 
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency(); 
builder.RegisterType<BookService>().As<IBookService>(); 

builder.RegisterFilterProvider(); 
IContainer container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

classe Repository:

public class Repository<T> : IRepository<T> where T : class 
{ 
    private DbContext _dbContext; 
    private DbSet<T> _dbSet; 

    public Repository(DbContext dbContext) 
    { 
     _dbContext = dbContext; 
     _dbSet = dbContext.Set<T>(); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return _dbSet; 
    } 
} 

couche de service:

public class BookService : IBookService 
{ 
    private IRepository<Book> _bookRepository; 

    public BookService(IRepository<Book> bookRepository) 
    { 
     _bookRepository = bookRepository; 
    } 

    public IEnumerable<Book> GetBooks() 
    { 
     return _bookRepository.GetAll(); 
    } 
} 

Controller:

public class BookController : Controller 
{ 
    private IBookService _bookService; 

    public BookController(IBookService bookService) 
    { 
     _bookService = bookService; 
    } 

    // GET: Book 
    public ActionResult Index() 
    { 
     var books = _bookService.GetBooks(); 

     return View(books); 
    } 
} 

Répondre

0

Essayez quelque chose comme:

public class MyDbContext1 : DbContext 
{ 
    public MyDbContext1() 
    :base("ConnectionString") 
    { } 

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class 
    { 
    return base.Set<TEntity>(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    //... 
    } 
} 

Et ajouter au référentiel nouvelle propriété

private IDbSet<T> Entities 
{ 
    get 
    { 
    if (_dbSet == null) 
    { 
     _dbSet = _dbContext1.Set<T>(); 
    } 
    return _dbSet; 
    } 
} 
+0

oui je sais, mais je veux ajouter un contexte qui s'appelle MyDbContext2 et que je vais implémenter dans un référentiel générique. –

+0

C'est une idée étrange mais quel est le problème d'ajouter un autre dbcontexts? – Marusyk

+0

J'ai mis à jour ma question et j'espère si évident pour vous –

2

Mon projet utilise 2 bases de données différentes et de la couche de service mettra en œuvre à partir de ce référentiel générique. Je veux MyService1 œuvres avec MyDbContext1 et myservice2 travaille avec MyDbContext2

de ne pas new votre DbContext dans votre dépôt. Cela rend les tests difficiles de toute façon.

l'injectons:

public Repository(DbContext dbContext) 
{ 
    _dbContext = dbContext; 
} 

Maintenant, le dépôt ne se soucie pas quelle classe DbContext dérivée est injectée. Cela fonctionne parce que vous appelez seulement DbContext.Set<T>().

+0

J'ai essayé de cette façon et après avoir utilisé l'injection de dépendance. puis-je enregistrer MyDbContext1 et MyDbContext2 en tant que DbContext –

+0

Peut-être assez évident, mais dans service1, configurez votre conteneur IOC pour injecter MyDbContext1, et dans service2 configurez votre conteneur IOC pour injecter MyDbContext2. – CodeCaster

+0

Non, vous indiquez d'abord votre code actuel dans votre question. :) Je ne sais pas quels sont vos "services" ni comment vous configurez actuellement votre conteneur. – CodeCaster