我有2个实现IMyInterface
的类,我们称它们为ClassA
和ClassB
。这里的问题是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>();
像这样注册类型意味着"对于类ClassA
将ClassB
实例用于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
。