我需要了解界面:
我有这个结构:
Core (contain Interface)
BLL (Contain object who implement interface
DAL (Contain Data access)
IHM (Call BLL object)
例如,我有一个Interface Core.IVehicle描述了一个基本的车辆:
Color
Speed
还有一种方法:
LoadVehicle(int id) //return a iVehicule with speed and color
在我的BLL中,我有一个实现“Core.IVehicle”的对象“BLL.Car”。 因此,我将拥有一个LoadVehicle方法并访问DAL以获取基本信息
但是DAL需要返回一个实现的对象“BLL.Car”。但由于循环依赖性,我无法引用BLL。
我想念的是什么?我的DAL如何返回实现的对象“BLL.Car”?
答案 0 :(得分: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
位于Core DLL中,所以您可以在所有图层中共享它,因此您无需担心循环引用,并且它会为您提供一致的返回类型。