1

希望能够提供一个关于使用Unity和依赖注入的快速问题。我浏览过stackoverflow和搜索引擎,但还没有找到这是可能的。将Unity中的不同DbContext映射到存储库接口的不同实例

我实际上有两个不同的dbcontexts和我想用于上下文的通用存储库。

public static void RegisterComponents() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<DbContext, DBContext1>(new PerResolveLifetimeManager()); 
    container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 

    container.RegisterType<DbContext, DBContext2>(new PerResolveLifetimeManager()); 
    container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
    container.RegisterType<IUnitOfWork, UnitOfWork>(); 

    ...... 

    container.RegisterType<IGenderService, GenderService>(); 
    container.RegisterType<ILanguageService, LanguageService>(); 

    ....... 

    container.RegisterType<IPhotoService, PhotoService>(); 
} 

但是,当我调用IPhotoService时,Visual Studio会抛出一个错误,说模型(照片)不是上下文的一部分。这是由于Photo模型位于DBContext1中,但在代码中稍后使用DBContext2覆盖IRepository映射。

有没有一种办法:

  • 名这些不同的DbContext映射

  • 有两个不同的IRepository映射到不同的DbContexts

  • 注入一个名为IRepository映射到具体类例如照片服务?

感谢

+0

我不知道Unity,但在StructureMap中,您可以命名上下文以便您可以通过调用它来解析实现,如下所示:Container.Resolve ().Named(“ThisOne”) –

回答

0

发现了它,你可以注册命名实例在Unity像这样:

container.RegisterType<Type2>("Instance 1", new ContainerControlledLifetimeManager()); 
container.RegisterType<Type2>("Instance 2", new ContainerControlledLifetimeManager()); 

然后解决它同样:

Type2 instance1 = container.Resolve<Type2>("Instance 1"); 
+0

感谢您的回复佩德罗。我对如何实现这一点感到困惑 – user6008632

0
public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<DbContext, DBContext1>(new PerThreadLifetimeManager()); 
     container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
     container.RegisterType<IUnitOfWork, UnitOfWork>(); 

     container.RegisterType<IRepository<Photo>, Repository<Photo>>(new PerThreadLifetimeManager(),new InjectionConstructor(new DBContext2())); 
     .... 
     container.RegisterType<IGenderService, GenderService>(); 
     container.RegisterType<ILanguageService, LanguageService>(); 
     .... 
     container.RegisterType<IPhotoService, PhotoService>(); 
     } 

好我使用这段代码解决了这个问题,但并不确信这是最好的方式。

基本上IPhotoService使用需要DbContext2的IRepository。所以我在代码中编写了这个解析器,并且实际上将DbContext作为一个可以工作的injectionConstructor传递。

DbContext1上下文与IGenderService,ILanguageService一样可以像以前那样工作。

0

单独注册上下文。

container.RegisterType<DbContext, DBContext1>(new PerThreadLifetimeManager()); 
container.RegisterType<DbContext2, DbContext2>(new PerThreadLifetimeManager()); 

然后在你的仓库情况下,接受所有的各种DbContexts的:

public class Repository<T> 
{ 
    protected DbContext1 DbCtxt1 { get; } 
    protected DbContext2 DbCtxt2 { get; } 

    public Repository<T>(DbContext1 ctx1, DbContext2 ctx2) 
    { 
     DbCtxt1 = ctx1; 
     DbCtxt2 = ctx2; 
    } 
} 

然后你可以指定一个作为默认,但在一般的仓库,使你的T型构建一些逻辑重写它。巨大的好处是,您可以从保存服务中访问所有不同的上下文。

也许而不是纯粹的泛型T,它必须是一个强制子类实现DbContext选择器或者其他类型的接口。

相关问题