C# 按对象类型解析服务的设计模式?
我试图重构一些代码,这些代码基本上在对象类型上有一个switch语句,并基于该类型调用特定的服务方法。我尽可能地保持相同的代码C# 按对象类型解析服务的设计模式?,c#,design-patterns,dependency-injection,structuremap,C#,Design Patterns,Dependency Injection,Structuremap,我试图重构一些代码,这些代码基本上在对象类型上有一个switch语句,并基于该类型调用特定的服务方法。我尽可能地保持相同的代码 if (user is Employee) { _userService.DoSomething(user); } else if (user is Manager) { _managerService.DoSomething(user); } else if (user is Executive) { _executiveSe
if (user is Employee)
{
_userService.DoSomething(user);
}
else if (user is Manager)
{
_managerService.DoSomething(user);
}
else if (user is Executive)
{
_executiveService.DoSomething(user);
}
我希望将服务调用抽象到接口,并减少代码行数。我的问题是关于ServiceResolver部分,是否存在与此类问题相关联的特定设计模式?我可以很容易地创建一个类,该类具有一个switch语句,该语句返回实现接口的正确服务,但它看起来不像我希望的那样干净。有什么建议吗?我已经在使用结构映射构造函数注入了,它可以与条件或其他东西一起使用吗
public interface IUserDoSomethingService
{
void DoSomething(User user)
}
var userDoSomethingService = _userDoSomethingServiceResolver(user);
userDoSomethingService.DoSomething(user);
在我看来,适合您的情况的设计模式是策略模式。你可以在这里参考: 您可以将每个类型名称注册为结构映射中的键,以解析相应的具体类
希望对您有所帮助。在我看来,适合您情况的设计模式是策略模式。你可以在这里参考: 您可以将每个类型名称注册为结构映射中的键,以解析相应的具体类
希望对您有所帮助。简单!我假设您不需要强制转换(您实际上拥有强类型的类型) 在这种情况下,您只需要一个关于IDoSomethingService的泛型
public interface IServiceDoSomethingOn<in T>
{
void DoSomethingOn(T thing);
}
傻瓜!我假设您不需要强制转换(您实际上拥有强类型的类型) 在这种情况下,您只需要一个关于IDoSomethingService的泛型
public interface IServiceDoSomethingOn<in T>
{
void DoSomethingOn(T thing);
}
我的想法是:
public interface IUserDoSomethingService {
void DoSomething(Employee user);
void DoSomething(Manager user);
void DoSomething(Executive user);
}
我的想法是:
public interface IUserDoSomethingService {
void DoSomething(Employee user);
void DoSomething(Manager user);
void DoSomething(Executive user);
}
您还可以使用托管扩展性框架(MEF),它是.Net中
System.ComponentModel.Composition
命名空间的一部分,可以与ServiceLocator
模式结合使用。
以下是一些关于MEF的文章
:
您还可以使用托管扩展性框架(MEF),它是.Net中
System.ComponentModel.Composition
命名空间的一部分,可以与ServiceLocator
模式结合使用。
以下是一些关于MEF的文章
:
为什么不抽象工厂模式
public class UserServiceFactory : IUserServiceFactory {
public EmployeeServiceFactory(IUserService employeeService
, IUserService managerService
, IUserService executiveService) {
//null guards
this.employeeService = employeeService;
this.managerService = managerService;
this.executiveService = executiveService;
}
}
从这里开始,您有两个选项,使用传统的if-else语句或策略模式来按对象类型解析
If-else示例(UserServiceFactory内部的方法):
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
按对象类型解析:
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
应该有另一种方法,通过使用命名而不是配置,但我仍然无法做到这一点
直接呼叫中的用法:
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
在其他服务中的用法,注入工厂而不是服务集合
public class UserServiceConsumer:IUserServiceConsumer {
public UserServiceConsumer(IUserServiceFactory userServiceFactory) {
this.userServiceFactory = userServiceFactory;
}
IUserServiceFactory userServiceFactory;
public void ConsumeFactory(User user) {
//do some validation maybe
userServiceFactory.DoSomething(user);
}
}
听起来可能很复杂,但理解后就足够简单了。为什么不抽象工厂模式呢
public class UserServiceFactory : IUserServiceFactory {
public EmployeeServiceFactory(IUserService employeeService
, IUserService managerService
, IUserService executiveService) {
//null guards
this.employeeService = employeeService;
this.managerService = managerService;
this.executiveService = executiveService;
}
}
从这里开始,您有两个选项,使用传统的if-else语句或策略模式来按对象类型解析
If-else示例(UserServiceFactory内部的方法):
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
按对象类型解析:
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
应该有另一种方法,通过使用命名而不是配置,但我仍然无法做到这一点
直接呼叫中的用法:
public void DoSomething(User user) {
if (user is Employee) {
employeeService.DoSomething(user);
}
else if (user is Manager) {
managerService.DoSomething(user);
}
else if (user is Executive) {
executiveService.DoSomething(user);
}
}
public void DoSomething(Employee user) {
employeeService.DoSomething(user);
}
public void DoSomething(Manager user) {
managerService.DoSomething(user);
}
public void DoSomething(Executive user) {
executiveService.DoSomething(user);
}
public void CallUser() {
// declare the services and user here
UserServiceFactory userServiceFactory = new UserServiceFactory(employeeService
, managerService
, executiveService);
userServiceFactory.DoSomething(user);
}
在其他服务中的用法,注入工厂而不是服务集合
public class UserServiceConsumer:IUserServiceConsumer {
public UserServiceConsumer(IUserServiceFactory userServiceFactory) {
this.userServiceFactory = userServiceFactory;
}
IUserServiceFactory userServiceFactory;
public void ConsumeFactory(User user) {
//do some validation maybe
userServiceFactory.DoSomething(user);
}
}
这听起来可能很复杂,但理解之后就足够简单了。我认为这是正确的。对于ServiceResolver.Current.Resolve(),有没有一种方法可以在不传递T的情况下进行解析?我没有定义t泛型,只有对象类型。我认为这是正确的。对于ServiceResolver.Current.Resolve(),有没有一种方法可以在不传递T的情况下进行解析?我没有定义t泛型,只有对象类型。