Unity IoC-如何指定要使用的注册

时间:2020-05-14 20:28:01

标签: c# unity-container

我有2个实现IMyInterface的类,可以将它们称为ClassAClassB。这里的问题是ClassA也需要IMyInterface,它应该是ClassB的实现。还有ClassConsumer应该使用ClassA(是IMyInterface并依赖IMyInterface的人)

有没有办法做类似的事情?:

var container = new UnityContainer();

//... several others registrations 

container.RegisterType<ITransactionProcessingService, ClassConsumer>();

var specialRegistrationForIMyInterface = _container.RegisterType<IMyInterface, ClassB>();
container.RegisterType<IMyInterface, ClassA>(specialRegistrationForIMyInterface);

代码示例:

public interface IMyInterface
{
    void PushToDatabase();
}

public class ClassA : IMyInterface
{
    IMyInterface _IMyInterface;
    public ClassA(IMyInterface myInterface)
    {
        _IMyInterface = myInterface;
    }

    public void PushToDatabase()
    {
        //do other stuff
        //BusinessCheck();
        //Log();
        //Cache();
        _IMyInterface.PushToDatabase();
    }
}

public class ClassB : IMyInterface
{
    public void PushToDatabase()
    {
        //Actual insert on database
    }
}

编辑2:Progman建议后的代码:

var container = new UnityContainer();

//... several others registrations 

container.RegisterType<IMyInterface, ClassB>("Foo");
container.RegisterType<IMyInterface, ClassA>("Bar", new InjectionConstructor(new ResolvedParameter<IMyInterface>("Foo")));


container.RegisterType<ITransactionProcessingService, ClassConsumer>(new InjectionConstructor(new ResolvedParameter<IMyInterface>("Bar")));

,我收到一条错误消息“找不到与成员匹配的数据。”

1 个答案:

答案 0 :(得分:1)

您可以使用InjectionConstructor为构造函数提供其他信息。将它与ResolveParameter一起使用以指定要注入的特定实例。假设您具有以下类和接口:

public interface IMyInterface
{
    void PushToDatabase();
}

public class ClassA : IMyInterface
{
    public ClassA(IMyInterface myInterface)
    {
        Console.WriteLine("Constructor of ClassA was injected with: "+myInterface);
    }

    public void PushToDatabase()
    {
    }
}

public class ClassB : IMyInterface
{
    public void PushToDatabase()
    {
        //Actual insert on database
    }
}

public class ClassC : IMyInterface
{
    public void PushToDatabase()
    {
        //Actual insert on database
    }
}
public class ClassD : IMyInterface
{
    public void PushToDatabase()
    {
        //Actual insert on database
    }
}

有四种可能的实现。您可以注册所有实例,但是对于类ClassA,可以指定要注入的实例。

var container = new UnityContainer();

container.RegisterType<IMyInterface, ClassB>();
container.RegisterType<IMyInterface, ClassC>();
container.RegisterType<IMyInterface, ClassA>(new InjectionConstructor(new ResolvedParameter(typeof(ClassB))));
container.RegisterType<IMyInterface, ClassD>();

这样注册类型意味着“对于类ClassA,将ClassB的实例用于IMyInterface参数”。当您执行以下代码时:

var classA = container.Resolve<ClassA>();
Console.WriteLine("Resolved to: "+classA);

var myInterface = container.Resolve<IMyInterface>();
Console.WriteLine("Resolved to: "+myInterface);

您将获得以下output

Constructor of ClassA was injected with: ClassB
Resolved to: ClassA
Resolved to: ClassD

如您所见,ClassA对象被注入了ClassB对象。您还会看到,当您请求IMyInterface时,您会得到上次注册的类型,在本例中为ClassD

相关问题