首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“公安条例”与“接口”( C#)

“公安条例”与“接口”( C#)
EN

Stack Overflow用户
提问于 2013-11-24 12:42:36
回答 1查看 471关注 0票数 0

我需要理解界面:

我有这样的结构:

代码语言:javascript
复制
Core (contain Interface)
BLL (Contain object who implement interface 
DAL (Contain Data access)
IHM (Call BLL object)

例如,我有一个接口Core.IVehicle,它描述了一个基本的工具,如:

代码语言:javascript
复制
Color
Speed

还有一种方法:

代码语言:javascript
复制
LoadVehicle(int id) //return a iVehicule with speed and color

在我的BLL中,我有一个实现"BLL.Car“的对象"Core.IVehicle”。因此,我将有一个LoadVehicle方法,并访问DALfor获取基本信息。

但是DAL需要返回一个实现的对象"BLL.Car“。但是我不能引用BLL,因为它是循环依赖的。

我错过了什么?我的DAL如何返回实现的对象"BLL.Car“?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-24 13:10:46

但是DAL需要返回一个实现的对象"BLL.Car“。

这可能就是混乱的所在。

DAL 不应该返回BLL版本的Car,DAL应该有它自己的Car版本,即实体/ DAO (数据访问对象)。BLL应该查询DAL中的car“实体”(它是以DTO还是IVehicle的形式返回),并构造它自己的Car aka域模型表示。

因此,概括地说,您应该有2个(或者3个,如果您也想要一个视图模型)版本的Car,即

实体/DAO (DAL)

代码语言:javascript
复制
public class Car : IVehicle
{
}
...
public class CarRepository
{
    ...
    public IVehicle LoadVehicle(int id)
    {
        var entity = // query DB for instance of DAL.Car
        return entity;
    }
}

域模型(BLL)

代码语言:javascript
复制
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 (View)

代码语言:javascript
复制
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中,所以它可以在所有层之间共享,所以您不需要担心循环引用,并且它提供了一致的返回类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20174593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档