Unity基于类请求实例解析

时间:2017-02-07 22:07:13

标签: c# dependency-injection unity-container

我试图在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实例。

感谢您的帮助。

编辑:更正了我的拼写错误

1 个答案:

答案 0 :(得分: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的类型,因此您还必须告诉Unity其中一个实施方案想要ISomeInterface时想要。