[英]C# How to decide which class to run in Dependency Injection based on multiple classes implement using same interface
I am working on .NET 6.0 application.我正在开发 .NET 6.0 应用程序。
I have an Interface IDestinationFileNaming
that is implemented by multiple classes.我有一个由多个类实现的接口
IDestinationFileNaming
。 How I Can choose which class to call based on they implementing same interface.我如何根据它们实现相同的接口来选择调用哪个类。 Does Iterface where T :Class plays role here?
Iterface where T :Class 在这里起作用吗?
public interface IDestinationFileNaming
{
string Generate();
}
ClassA
That Implements above interface实现上述接口的
ClassA
public class ClassA : BaseFileNaming, IDestinationFileNaming
{
public ClassA()
: base() { }
public override string Generate()
{
string fileName = string.Empty;
try
{
fileName = BaseName + "AIM_UBW";
}
catch (Exception ex)
{ }
return fileName;
}
I ClassB
That Implements above interface实现上述接口的
ClassB
public class ClassB : BaseFileNaming, IDestinationFileNaming
{
public ClassB()
: base() { }
public override string Generate()
{
string fileName = string.Empty;
try
{
fileName = BaseName + "DDS_UBW";
}
catch (Exception ex)
{ }
return fileName;
}
}
I have register dependencies in DI Container as我在 DI Container 中注册依赖项为
services.AddScoped<IDestinationFileNaming, ClassA>();
services.AddScoped<IDestinationFileNaming, ClassB>();
ClassC
I want to run ClassA
here...我想在这里运行
ClassA
...
public class ClassC{
private readonly IDestinationFileNaming _destinationFileNaming;
public ClassC(IDestinationFileNaming destinationFileNaming)
:base()
{
this._destinationFileNaming = destinationFileNaming;
}
public void Run(){
// Hot to call ClassA from using above Interface?
}
}
I have found two approaches我找到了两种方法
approach 1
register dependencies注册依赖项
services.AddScoped<IDestinationFileNaming, ClassA>();
services.AddScoped<IDestinationFileNaming, ClassB>();
Class C
public class ClassC{公共类 ClassC{
private readonly IEnumerable _destinationFileNaming;私有只读 IEnumerable _destinationFileNaming;
public ClassC(IEnumerable destinationFileNaming) public ClassC(IEnumerable destinationFileNaming)
:base() { this._destinationFileNaming = destinationFileNaming; :base() { this._destinationFileNaming = destinationFileNaming; }
}
public void Run(){
}
private dynamic ResolveObject()
{
var x = _destinationFileNamings.SingleOrDefault(_ => _.GetType() == typeof(ClassA));
var y = x.Generate();
var a = _destinationFileNamings.SingleOrDefault(_ => _.GetType() == typeof(ClassB));
var b = a.Generate();
return x;
}
}
option 2
interface
public interface IDestinationFileNaming<T> where T : class
{
string Generate();
}
register in DI在 DI 注册
services.AddScoped<IDestinationFileNaming<ClassA>, ClassA>();
services.AddScoped<IDestinationFileNaming<ClassB>, ClassB>();
Class C
public class ClassC{
private readonly IDestinationFileNaming<ClassA> _destinationFileNaming;
public ClassC(IDestinationFileNaming<ClassA> destinationFileNaming)
:base()
{
this._destinationFileNaming = destinationFileNaming;
}
public void Run(){
x = _destinationFileNaming.Generate();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.