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



我有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")));

我收到错误"未找到与成员匹配的数据"。

可以使用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>();

像这样注册类型意味着"对于类ClassAClassB实例用于IMyInterface参数"。执行以下代码时:

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

您将获得以下输出:

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

如您所见,ClassA对象注入了一个ClassB对象。您还会看到,当您请求IMyInterface时,您将获得最后一个注册的类型,在本例中为ClassD

相关内容

最新更新