可以传递参数以选择要使用的代码的泛型实现

Generic implementation that can pass parameter to choose which code to use

提问人:Bohn 提问时间:11/18/2023 更新时间:11/18/2023 访问量:39

问:

我有一个这样的:interface

public interface IIdentifierManager
{
    Task<bool> Method1(string identifierName, string identifier);
    Task<bool> Method2(IEnumerable<string> ids);
}

五个已经实现了它,例如:classes

public class CatIdentifierManager: IIdentifierManager
{
   // you know the dill!
}

所以当我有:

IEnumerable<IIdentifierManager> idManagers;

根据我想要的实现,我是这样做的:

 var myVar1 = idManagers.OfType<JoeIdentifierManager>()?.FirstOrDefault();
 var myVar2 = idManagers.OfType<HisIdentifierManager>()?.FirstOrDefault();
 var myVar3 = idManagers.OfType<HerIdentifierManager>()?.FirstOrDefault();
 var myVar4 = idManagers.OfType<CatIdentifierManager>()?.FirstOrDefault();
 var myVar5 = idManagers.OfType<DogIdentifierManager>()?.FirstOrDefault();

我正在寻找一个更好的设计建议,所以也许我可以有一个包含所有这五个的主要实现,也许我会通过一个来告诉它使用哪一个。 你建议怎么做?parameter

C# 泛型 设计模式 接口

评论

0赞 Jon Skeet 11/18/2023
你不想要一个或类似的东西有什么理由吗?只需根据键从字典中获取“正确”的键即可。如果这不合适,请澄清问题 - 目前我无法想象答案会是什么样子,因为问题不够具体。Dictionary<string, IIdentifierManager>
2赞 Rajesh P 11/18/2023
@Bohn:我看到工厂模式在这里很合适,如下所示public class IdentifierManagerFactory { public IIdentifierManager GetIdentifierManager(string managerType) { switch (managerType) { case "Joe": return new JoeIdentifierManager(); } } }

答:

2赞 BenMcLean981 11/18/2023 #1

不要做任何愚蠢的事情,比如用一个带有设置参数的方法来选择实现。你可能想要一个静态工厂方法,为你选择一个实现,然后你可以调用该方法。

不要害怕有一些额外的类或方法,只要它们很好,很整洁。许多开发人员认为方法和类越少越好,但根据我的经验,随着代码库的增长,这会导致混乱。您想要更改现有行为,但它已完全耦合到函数的所有其他变体。