2013-11-24 49 views
0

我需要了解接口:POO和接口(在C#)

我有這樣的結構:

Core (contain Interface) 
BLL (Contain object who implement interface 
DAL (Contain Data access) 
IHM (Call BLL object) 

例如,我有一個接口Core.IVehicle誰描述一個基本車輛等:

Color 
Speed 

和一種方法:

LoadVehicle(int id) //return a iVehicule with speed and color 

在我的BLL中,我有一個實現「Core.IVehicle」的對象「BLL.Car」。 因此,我將有一個LoadVehicle方法和訪問DALfor獲取基本信息

但DAL需要返回一個對象「BLL.Car」實現。但由於循環依賴關係,我無法對BLL進行參考。

我錯過了什麼?我的DAL如何返回一個對象「BLL.Car」?

+0

POO?什麼是公安條例? – FaddishWorm

+0

poco ..普通舊clr對象 –

+0

我認爲你的意思是OOP面向對象編程 – user123456

回答

2

但DAL需要返回一個對象「BLL.Car」實現。

這可能是混淆的地方。

你的DAL 不應返回Car的BLL版本中,DAL應該有它的Car又名實體/DAO(數據訪問對象)的自己的版本。 BLL應該向DAL查詢汽車「實體」(無論它是作爲DTO還是IVehicle返回),並構建它自己的代表Car(也稱爲域模型)。

因此,要總結,你應該有2個(或3,如果你想有一個視圖模型爲好)的版本Car

實體/ DAO(DAL)

public class Car : IVehicle 
{ 
} 
... 
public class CarRepository 
{ 
    ... 
    public IVehicle LoadVehicle(int id) 
    { 
     var entity = // query DB for instance of DAL.Car 
     return entity; 
    } 
} 

域模型( BLL)

public class Car : IVehicle 
{ 
} 
... 
public class CarService 
{ 
    public IVehicle FindCarById(int id) 
    { 
     var repo = new DAL.CarRepository(...); 
     var carEntity = repo.LoadVehicle(id); // returns DAL.Car instance 
     return new BLL.Car // we turn DAL.Car into our DLL.Car 
     { 
      Color = carEntity.Color, 
      Speed = carEntity.Speed 
     }; 
    } 
} 

IHM(查看)

public class Controller 
{ 
    public void ViewCarDetails(int id) 
    { 
     var carService = new BLL.CarService(); 
     var car = carService.FindCarById(id); 
     // populate UI with `car` properties 
    } 
} 

因爲IVehicle在覈心DLL可以在所有圖層共享的,所以你不必擔心循環引用,和它給你一個一致的返回類型。

+0

但是[所有此分層值得映射](http://blog.ploeh.dk/2012/02/09/IsLayeringWorththeMapping/)? – Steven

+0

@Steven如果你想實現一個純粹的分層架構,那麼是的。像[AutoMapper](https://github.com/AutoMapper/AutoMapper)這樣的庫使這個平凡的任務變得非常簡單。我理解Mark正在嘗試做的一點(但我已閱讀過該文章),但對我而言,讓您的域獨立於UI和DAL仍然是一種好的做法,因爲讓我們面對它,應用程序會不斷髮展,無論您有多確定事情不會改變 - 沒有人能預測未來。所以這個問題真的變成了現在分離你的圖層而不得不稍後重構的努力。 – James