C# 如何处理业务对象之间的依赖关系

C# 如何处理业务对象之间的依赖关系,c#,.net,C#,.net,抱歉,如果以前有人问过这个问题,我找不到类似的问题,所以我只能假设我的术语是错误的 无论如何,我想知道如何处理业务层对象之间的依赖关系。假设我有两个业务对象: 车轮维修 public class WheelService : IWheelService { private IWheelRepository Repository { get; set; } public WheelService(IWheelRepository repository) {

抱歉,如果以前有人问过这个问题,我找不到类似的问题,所以我只能假设我的术语是错误的

无论如何,我想知道如何处理业务层对象之间的依赖关系。假设我有两个业务对象:

车轮维修

public class WheelService : IWheelService
{
    private IWheelRepository Repository { get; set; }

    public WheelService(IWheelRepository repository)
    {
        this.Repository = repository;
    }

    public Wheel Get(int id) { ... }
}
还有汽车服务

public class CarService : ICarService
{
    private ICarRepository Repository { get; set; }

    public CarService(ICarRepository repository)
    {
        this.Repository = repository;
    }

    public void Create(Car newCar)
    {
        // I need to access functions from the WheelService here
    }
}

您将使用什么样的体系结构,使我能够以松散耦合的方式从一个业务对象调用另一个业务对象的方法,这种方式也很适合TDD?

只需按照在构造函数中添加存储库依赖性的方式添加它们即可:

public CarService(ICarRepository repository, IWheelService wheelservice)
{
    ...
}

您还可以使用
Builder
模式,如果您有许多依赖项,这将非常有用

public class CarService : ICarService
{
    private ICarRepository Repository { get; set; }
    private IWheelService WheelService { get; set; }

    public CarService(ICarRepository repository)
    {
        this.Repository = repository;
    }

    public ICarService WithWheelService(IWheelService service)
    {
        // do arguments check
        if(service == null) throw ...;

        WheelService = service;
        return this;
    }
    public Car Build()
    {
        return new Car(WheelService, ...);        
    }
}
这是用法

ICarService carService = new CarService();
IWheelService wheelService = new WheelService();
...    
carService.WithWheelService(wheelService)
          .WithSomethingElse(somethingElse)
          .WithLights(brightLights)
          .UsingMainColour(selectedColour);
var car = carService.Build()
看到这些线了吗

ICarService carService = new CarService();
IWheelService wheelService = new WheelService();

在这里,您可以使用IoC容器来解析所需的类。

在IoC中注册服务,如果没有循环依赖关系,则使用构造函数注入。通常不能同时将ServiceA注入ServiceB和ServiceB注入ServiceA。在这种情况下,您将需要另一个服务设计或第三个处理依赖关系的ServiceC。是的,事实上这是一个公平的观点-有时是您无法看到的简单事情!如果存在大量依赖项,您是否会做一些不同的事情,或者您是否会说这表明服务过于复杂?过于复杂是一种气味,这意味着您必须在服务中承担许多责任。把他们分成不同的类别。源代码应该简单,而不是复杂。