我有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")));
,我收到一条错误消息“找不到与成员匹配的数据。”
答案 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
。