Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按对象类型解析服务的设计模式?_C#_Design Patterns_Dependency Injection_Structuremap - Fatal编程技术网

C# 按对象类型解析服务的设计模式?

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

我试图重构一些代码,这些代码基本上在对象类型上有一个switch语句,并基于该类型调用特定的服务方法。我尽可能地保持相同的代码

 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泛型,只有对象类型。