【问题标题】:Unity resolve based on class requesting instanceunity resolve 基于类请求实例
【发布时间】:2017-02-07 22:07:13
【问题描述】:

我正在尝试在 Unity 中设置注册,但无法准确获取所需内容。

假设我有以下定义:

public interface ISomeInterface { ... }

public interface ISomeDependency { ... }

public class DependencyA : ISomeDependency { ... }

public class DependencyB : ISomeDependency { ... }

public class SomeClassA : ISomeInterface
{
    public SomeClassA(ISomeDependency dep){ ... }
}

public class SomeClassB : ISomeInterface
{
    public SomeClassB(ISomeDependency dep){ ... }
}

然后我将它们注册到 Unity,如下所示:

Container.RegisterType<ISomeDependency, DependencyA>("DependencyA");
Container.RegisterType<ISomeDependency, DependencyB>("DependencyB");
Container.RegisterType<ISomeInterface, SomeClassA>("ClassA");
Container.RegisterType<ISomeInterface, SomeClassB>("ClassB");

我还注册了一个工厂,它将基于密钥构建ISomeInterface

Container.RegisterType<Func<string, ISomeInterface>(new InjectionFactory(c=>
{
    return new Func<string, ISomeInterface>(x=>
    {
        return c.Resolve<ISomeInterface>(x)
    }
}));

(顺便说一句,如果有人知道创建密钥工厂的更好方法,我会欢迎提示)

如何配置 Unity,以便当 Unity 为我构建 SomeClassA 的实例时,它也会注入 DependencyA 的实例?同样,当 Unity 为我构建 SomeClassB 的实例时,它会注入一个 DependencyB 的实例。

感谢您的帮助。

编辑:纠正我的错字

【问题讨论】:

标签: c# dependency-injection unity-container


【解决方案1】:

如果您为一个接口注册两种具体类型,Unity 将不知道要解析到哪一种。您必须提供更多信息。一种方法是使用参数覆盖。

// Override the constructor parameter "dep" value
// Use DependencyA instead of other value
var result = container.Resolve<ISomeInterface>(
    new ParameterOverride("dep", new DependencyA())
        .OnType<SomeClassA>());

但是,您还将机器人 SomeClassASomeClassB 注册为 ISomeInteface 的类型,因此当您需要 ISomeInterface 时,您还必须告诉 Unity 您想要其中的哪一种实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2019-04-06
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多