提问人:Bohn 提问时间:11/18/2023 更新时间:11/18/2023 访问量:39
可以传递参数以选择要使用的代码的泛型实现
Generic implementation that can pass parameter to choose which code to use
问:
我有一个这样的: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
答:
2赞
BenMcLean981
11/18/2023
#1
不要做任何愚蠢的事情,比如用一个带有设置参数的方法来选择实现。你可能想要一个静态工厂方法,为你选择一个实现,然后你可以调用该方法。
不要害怕有一些额外的类或方法,只要它们很好,很整洁。许多开发人员认为方法和类越少越好,但根据我的经验,随着代码库的增长,这会导致混乱。您想要更改现有行为,但它已完全耦合到函数的所有其他变体。
评论
Dictionary<string, IIdentifierManager>
public class IdentifierManagerFactory { public IIdentifierManager GetIdentifierManager(string managerType) { switch (managerType) { case "Joe": return new JoeIdentifierManager(); } } }