POO和接口(在C#中)
我需要了解接口: 我有这样的结构:POO和接口(在C#中),c#,oop,interface,dependency-injection,C#,Oop,Interface,Dependency Injection,我需要了解接口: 我有这样的结构: Core (contain Interface) BLL (Contain object who implement interface DAL (Contain Data access) IHM (Call BLL object) 例如,我有一个Interface Core.i车辆,它描述了一种基本的车辆,如: Color Speed 还有一种方法: LoadVehicle(int id) //return a iVehicule with speed
Core (contain Interface)
BLL (Contain object who implement interface
DAL (Contain Data access)
IHM (Call BLL object)
例如,我有一个Interface Core.i车辆,它描述了一种基本的车辆,如:
Color
Speed
还有一种方法:
LoadVehicle(int id) //return a iVehicule with speed and color
在我的BLL中,我有一个对象“BLL.Car”,它实现了“Core.IVehicle”。
因此,我将有一个LoadVehicle方法,并访问DalVehicle以获取基本信息
但是DAL需要返回一个对象“BLL.Car”。但由于循环依赖,我无法引用BLL
我错过了什么?我的DAL如何返回一个对象“BLL.Car”
但是DAL需要返回一个对象“BLL.Car”
这可能就是困惑所在
您的DAL不应返回Car
的BLL版本,DAL应拥有自己的Car
aka entity/DAO(数据访问对象)版本。BLL应该查询car“实体”的DAL(无论它是作为DTO还是IVehicle
)返回的),并构建它自己的car
aka域模型表示
所以总结一下,你应该有2个版本的Car
实体/DAO(DAL)
域模型(BLL)
IHM(视图)
由于
i内核
位于核心DLL中,因此它可以在所有层之间共享,因此您无需担心循环引用,它为您提供了一致的返回类型。poco。。简单的旧clr对象我认为你的意思是面向对象的OOP编程你的DAL应该返回BLL.Car实现是什么意思?你的意思是你的DAL应该返回一个包含所有数据的BLL对象;从数据库中填充的属性?阅读此问题,它可能有助于@FaddishWorm在意大利面向对象编程->POO Programmazione Orientata agli Oggetti。“我想在法国也有类似的情况,但实际上是吗?”史蒂文如果你想实现一个纯粹的分层架构,那么是的。像这样的库使这个平凡的任务变得非常简单。我理解Mark试图表达的观点(我以前读过那篇文章),但是,对我来说,保持您的域独立于UI&DAL仍然是一个很好的实践,因为,让我们面对现实,应用程序不断发展,无论您多么确信事情不会改变——没有人能够预测未来。因此,问题真的变成了,现在是否值得努力分离层,而不是以后必须重构?
public class Car : IVehicle
{
}
...
public class CarRepository
{
...
public IVehicle LoadVehicle(int id)
{
var entity = // query DB for instance of DAL.Car
return entity;
}
}
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
};
}
}
public class Controller
{
public void ViewCarDetails(int id)
{
var carService = new BLL.CarService();
var car = carService.FindCarById(id);
// populate UI with `car` properties
}
}