我确实会根据应用程序中的枚举返回不同的服务实例:
public (????) CurrentService
{
get
{
switch (CurrentServiceEnum)
{
case ServiceType.ServiceA:
return IoC.ServiceA;
case ServiceType.ServiceB:
return IoC.ServiceB;
case ServiceType.ServiceC:
return IoC.ServiceC;
}
}
}
该服务的每一个都有其自己的RemoveAccount
方法的实现,采用不同类型的参数。
internal class ServiceA_AccountDataModel { [..] }
internal class ServiceB_AccountDataModel { [..] }
internal class ServiceC_AccountDataModel { [..] }
public class ServiceA {
public void RemoveAccount(ServiceA_AccountDataModel model) { [...] }
}
public class ServiceB {
public void RemoveAccount(ServiceB_AccountDataModel model) { [...] }
}
public class ServiceC {
public void RemoveAccount(ServiceC_AccountDataModel model) { [...] }
}
我在这里想要实现的是能够在返回的当前服务之外调用RemoveAccount
方法,以便在传递account
的{{1}}时应自动解析为ServiceC_AccountDataModel
。
IoC.ServiceC
有没有办法在C#中实现类似的目标?
答案 0 :(得分:1)
一种实现此目的的方法是让所有服务实现一个公共接口:
public interface IAccountRemovalService<T>
{
void RemoveAccount<T>(T model);
}
public class ServiceA : IAccountRemovalService<ServiceA_AccountDataModel>
{
public void RemoveAccount<ServiceA_AccountDataModel>(ServiceA_AccountDataModel model)
{
}
}
public class ServiceB : IAccountRemovalService<ServiceB_AccountDataModel>
{
public void RemoveAccount<ServiceB_AccountDataModel>(ServiceA_AccountDataModel model)
{
}
}
要使其正常工作,您确实需要在每个模型类型之间都有一些共同点,例如AccountModelDataBase
之类的基类:
public class ServiceA_AccountDataModel : AccountDataModelBase {}
public class AccountDataModelBase {}
一旦掌握了这一点,就有可能按照以下几行来重新编写CurrentService
属性:
public IAccountRemovalService<AccountDataModelBase> CurrentService
{
get
{
IAccountRemovalService<AccountDataModelBase> returnedValue = null;
switch (CurrentServiceEnum)
{
case ServiceType.ServiceA:
returnedValue = IoC.ServiceA as IAccountRemovalService<AccountDataModelBase>;
break;
case ServiceType.ServiceB:
returnedValue = IoC.ServiceB as IAccountRemovalService<AccountDataModelBase>;
break;
case ServiceType.ServiceC:
returnedValue = IoC.ServiceC as IAccountRemovalService<AccountDataModelBase>;
break;
}
return returnedValue;
}
}
这确实涉及对代码的许多更改,添加了接口和基类,但这确实为您提供了一些优势,因为现在您可以确保(通过向IAccountRemovalService添加新成员)拥有RemoveAccount
方法的服务实现在其实现方法上保持锁步。
一个小注释,由于后缀CurrentServiceEnum
,因此您要打开的属性Enum
并不正确,这可能是考虑删除的原因-但这只是我的选择! =)