Autofac - 一个接口,多种实现
Autofac - One interface, multiple implementations
单一接口:IDoSomething {...}
两个 classes 实现了该接口:
ClassA : IDoSomething {...}
ClassB : IDoSomething {...}
一个 class 使用这些 class 中的任何一个。
public class DummyClass(IDoSomething doSomething) {...}
没有 Autofac 的代码:
{
....
IDoSomething myProperty;
if (type == "A")
myProperty = new DummyClass (new ClassA());
else
myProperty = new DummyClass (new ClassB());
myProperty.CallSomeMethod();
....
}
是否可以使用 Autofac 实现类似的功能?
提前致谢,
你要找的是,我记得是 Strategy Pattern。您可能有单个接口的 N 个实现。只要您将它们全部注册,Autofac 或任何其他 DI 框架都应该提供它们。
其中一个选项是在接口内创建一个带有私有 setter 或仅 getter 的 属性 声明,然后在每个 属性 中实现 属性 class。在需要select正确实现的class中,构造函数应该有参数IEnumerable<ICommon>
。
Autofac 或任何其他 DI 框架应该注入所有可能的实现。之后,您可以旋转 foreach
并搜索所需的 属性.
它可能看起来像这样。
public interface ICommon{
string Identifier{get;}
void commonAction();
}
public class A: ICommon{
public string Identifier { get{return "ClassA";} }
public void commonAction()
{
Console.WriteLine("ClassA");
}
}
public class A: ICommon{
public string Identifier { get{return "ClassB";} }
public void commonAction()
{
Console.WriteLine("ClassA");
}
}
public class Action{
private IEnumerable<ICommon> _common;
public Action(IEnumerable<ICommon> common){
_common = common;
}
public void SelectorMethod(){
foreach(var classes in _common){
if(classes.Identifier == "ClassA"){
classes.commonAction();
}
}
}
}
单一接口:IDoSomething {...}
两个 classes 实现了该接口:
ClassA : IDoSomething {...}
ClassB : IDoSomething {...}
一个 class 使用这些 class 中的任何一个。
public class DummyClass(IDoSomething doSomething) {...}
没有 Autofac 的代码:
{
....
IDoSomething myProperty;
if (type == "A")
myProperty = new DummyClass (new ClassA());
else
myProperty = new DummyClass (new ClassB());
myProperty.CallSomeMethod();
....
}
是否可以使用 Autofac 实现类似的功能?
提前致谢,
你要找的是,我记得是 Strategy Pattern。您可能有单个接口的 N 个实现。只要您将它们全部注册,Autofac 或任何其他 DI 框架都应该提供它们。
其中一个选项是在接口内创建一个带有私有 setter 或仅 getter 的 属性 声明,然后在每个 属性 中实现 属性 class。在需要select正确实现的class中,构造函数应该有参数IEnumerable<ICommon>
。
Autofac 或任何其他 DI 框架应该注入所有可能的实现。之后,您可以旋转 foreach
并搜索所需的 属性.
它可能看起来像这样。
public interface ICommon{
string Identifier{get;}
void commonAction();
}
public class A: ICommon{
public string Identifier { get{return "ClassA";} }
public void commonAction()
{
Console.WriteLine("ClassA");
}
}
public class A: ICommon{
public string Identifier { get{return "ClassB";} }
public void commonAction()
{
Console.WriteLine("ClassA");
}
}
public class Action{
private IEnumerable<ICommon> _common;
public Action(IEnumerable<ICommon> common){
_common = common;
}
public void SelectorMethod(){
foreach(var classes in _common){
if(classes.Identifier == "ClassA"){
classes.commonAction();
}
}
}
}