问题
I need to understand Interface :
I have this structure :
Core (contain Interface)
BLL (Contain object who implement interface
DAL (Contain Data access)
IHM (Call BLL object)
For example, i have an Interface Core.IVehicle who describe a basic vehicle like :
Color
Speed
And a one method :
LoadVehicle(int id) //return a iVehicule with speed and color
In my BLL, I have an object "BLL.Car" who implement "Core.IVehicle". So, i will have a LoadVehicle method and access to DALfor get basics informations
But DAL need to return an object "BLL.Car" implemented. But i can't make a reference to BLL because of Circular Dependencies.
What i've miss? How my DAL can return an object "BLL.Car" implemented?
回答1:
But DAL need to return an object "BLL.Car" implemented.
This is probably where the confusion lies.
Your DAL should not return the BLL version of Car
, the DAL should have it's own version of Car
aka entity / DAO (data access object). The BLL should query the DAL for the car "entity" (whether it be returned as a DTO or an IVehicle
) and construct it's own representation of Car
aka Domain Model.
So to summarise you should have 2 (or 3 if you want a view model as well) versions of Car
i.e.
Entity/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;
}
}
Domain Model (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 (View)
public class Controller
{
public void ViewCarDetails(int id)
{
var carService = new BLL.CarService();
var car = carService.FindCarById(id);
// populate UI with `car` properties
}
}
Because IVehicle
is in the Core DLL it can be shared across all your layers, so you don't need to worry about circular references, and it gives you a consistent return type.
来源:https://stackoverflow.com/questions/20174593/poo-and-interface-in-c