POO和接口(在C#中)

时间:2013-11-24 12:42:36

标签: c# oop interface dependency-injection

我需要了解界面:

我有这个结构:

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”?

1 个答案:

答案 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中,所以您可以在所有图层中共享它,因此您无需担心循环引用,并且它会为您提供一致的返回类型。