繁体   English   中英

Unity Dependency Injection如何将映射名称传递给在父对象构造函数中解析的子对象

[英]Unity Dependency Injection how to pass mapping name into sub objects resolved in parent objects constructor

我有以下问题

我正在开发Windows服务,将存储库注入到实体中以进行数据检索。 但是我有几个类似风格的存储库,将使用服务在其下运行的上下文来解析(运行时变量)

以下是我正在写的精简示例

public static void Main() {

IUnityContainer container = new UnityContainer();
container.RegisterType<IRepo, RepoBase>(new ContainerControlledLifetimeManager());

container.RegisterType<IRepo, RepoA>("processA", new ContainerControlledLifetimeManager());

container.RegisterType<IRepo, RepoB>("processB", new ContainerControlledLifetimeManager());

container.RegisterType<IEntity, EntityA1>("ProcessA");
container.RegisterType<IEntity, EntityA2>("ProcessB");

var processType = "ProcessB"; //this is read from a queue and changes with every request the service processes

var entityInstance = container.Resolve<IEntity>(ProcessType);
entityInstance.DoSomething()             }


public RepoBase : IRepo {
 public virtual object ReturnData() {return baseData}             }


public RepoA : RepoBase {
public override object ReturnData() {
    var x = base.ReturnData(); 
    return x + RepoAData; }             }


public RepoB : RepoBase {
public override object ReturnData() { return RepoBData; }             }


public class EntityA1 : IEntity {
public EntityA1(IRepo repo){...}
public void DoSomething() {
    var data = repo.ReturnData(); 
    //....Do something with data }             }



public class EntityA2 : IEntity {
public EntityA2(IRepo repo){...}
public void DoSomething()   {
    var data = repo.ReturnData(); 
    //....Do something with data }             }

我遇到的问题是,当我解析IEntity时,我想将上下文processType传递给IRepo的解析,以便将其解析为ProcessA的RepoA,ProcessB的RepoB等。

当前,由于没有传入上下文,因此解析为RepoBase。

另外,我认为我可以通过向Entity构造函数签名中添加依赖项属性来做到这一点,例如

public EntityA1([Dependency("ProcessA")] IRepo repo) {....}

但是,我不想随便乱扔这个类,因为它会将我的服务与我的依赖项注入注册/解决方案紧密结合在一起,而我希望将其分开并放置在一个中央位置(服务层而不是业务逻辑层或其他位置)下)。

对于在注册时如何执行此操作的任何建议,我将不胜感激。

谢谢

我要去工厂:

var entityInstance = myFactory.CreateEntity(ProcessType);

internal class EntityFactory
{
    public EntityFactory( IUnityContainer container )
    {
        _container = container;
    }

    public IEntity CreateEntity( string processType )
    {
        return _container.Resolve<IEntity>( processType, new ParameterOverride( "repo", _container.Resolve<IRepo>( processType ) ) );
    }

    private readonly IUnityContainer _container;
}

经过多次尝试,我找到了解决方案

_container.RegisterType<IEntity, EntityA1>("processA",
                        new InjectionConstructor(new ResolvedParameter<IRepo>("processA")));

然后,这解决了IRepo的正确映射

var entityInstance = container.Resolve<IEntity>(processType);

这达到了我希望在注册未解决时澄清这一点的目的。

如果有人对上述内容有所改进,我将很高兴收到您的来信。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM