请记住,如果不需要,我不打算添加其他依赖项。此外,大多数想法已经来自我在寻找解决方案时发现的这里 (stackoverflow.com)。
假设我有一个 IPrinterRepository 接口,我有多个不同的实现。
例如 EpsonRepository 和 CanonRepository、HPRepository 和许多其他人一样实现 IPrinterRepository
所以现在我像这样在ConfigurationServices 中注册了我的服务
services.AddTransient<EpsonRepository>();
services.AddTransient<HPRepository>();
services.AddSingleton<IPrinterRepositoryResolver, PrinterRepositoryResolver>();
- V1 -
现在,我一直在我的数据库中为某些特定用户激活的每台活动打印机保存一个 PRINTER_CODE。PrinterCode 是一类常量字符串。
PrinterRepositoryResolver 处理正确实现的选择。所以有一种方法可以使用 switch 语句做到这一点。
public IPrinterRepository GetRepository(string key)
{
switch (key)
{
case PrinterCode.Epson:
return (IPrinterRepository)_serviceProvider.GetService(typeof(EpsonRepository));
case PrinterCode.HP:
return (IPrinterRepository)_serviceProvider.GetService(typeof(HPRepository));
default:
throw new KeyNotFoundException("Sevice not implemented or not supported any more!");
}
}
- V2 -
或者我可以按类型选择正确的实现,这样我就不必使用 PRINTER_CODE 或维护 switch 语句。例子
而不是 PRINTER_CODE 将 DB 中实现的 fullName 保存为字符串,并在以后需要时使用它来选择正确的实现。
public IPrinterRepository GetRepository(string ImplementationName)
{
var repoType= Type.GetType(ImplementationName);
return (IPrinterRepository)_serviceProvider.GetService(repoType);
}
这一切都适用于我的开发环境,但我不知道是否可以。
就个人而言,我不喜欢这种开关,因为每次添加新的打印机实现时,都必须有人维护 PrinterCodes 和开关。
但是,保存一个带有命名空间的长字符串作为选择键在某种程度上很难看,我觉得可能还有更多我不知道的缺点。是否有一些调整或更好的想法,以便我可以以正确的方式做到这一点。
相关分类