2013-12-17 79 views
0

如果以前曾詢問過,我無法找到類似的問題,所以我只能假設我的術語是錯誤的!如何處理業務對象之間的依賴關係

無論如何,我想知道如何處理業務層對象之間的依賴關係。說我有兩個業務對象:

車輪服務

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?

+1

將服務註冊到您的IoC中,如果不存在循環依賴關係,則使用構造函數注入。通常您不能同時將ServiceA注入到ServiceB和ServiceB中。在這種情況下,您需要另一個服務設計或處理依賴性的第三個ServiceC。 – dixus

回答

2

只要加入他們,你在你的構造函數中添加你的資料庫的依賴同樣的方式:

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

是的,這實際上是一個公平點 - 有時它是簡單的東西,你只是看不到! – Mo09890

+0

如果存在大量的依賴關係,你會做什麼不同的事情嗎?或者你會說這一點超過了服務的複雜性? – Mo09890

+0

過度複雜是一種嗅覺,這意味着您必須在服務中承擔很多責任。將它們拆分成不同的類。源代碼應該很簡單,不復雜。 – Peter

0

你也可以使用一個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容器來解析所需類的地方。