1 回答

TA貢獻(xiàn)1798條經(jīng)驗 獲得超3個贊
3 層(反模式?)在這里是一個紅鯡魚,你本質(zhì)上是在談?wù)撘蕾囎⑷?。圖案。這些變得難以手動管理。我建議你實現(xiàn)一個像Simple Injector或 Unity這樣的 DI 框架。
我正在嘗試使用接口作為我的一些類的契約。
為什么有些課程?如果您要實現(xiàn)依賴注入,則在所有類上實現(xiàn)它。
我目前的問題是我看到一些方法在 BAL 和 DAL 對象之間是通用的,例如:Add、Remove、GetAll 因此我決定創(chuàng)建接口來實現(xiàn)這些東西
這是你的第一個錯誤。您已經(jīng)根據(jù)功能而不是責(zé)任進(jìn)行了分解。僅僅因為某些東西具有相似的方法簽名并不意味著它們應(yīng)該相關(guān)??蛻魳I(yè)務(wù)對象與客戶數(shù)據(jù)對象的職責(zé)非常不同。記住優(yōu)先組合勝過繼承。
但是當(dāng)從 BAL 類使用時,我需要像 void Add(Employee) 但在 DAL void Add(string name);
這只是突出了上述內(nèi)容,您已經(jīng)做出決定,因為這些方法被稱為“添加”,因此它們顯然不是。
我會說你應(yīng)該為每個對象實現(xiàn)一個接口,不要嘗試關(guān)聯(lián)不相關(guān)的對象,然后使用 DI 框架配置它,然后注入它們。盡量不要模糊您的線條并保持您的分隔清晰。請記住,您需要高內(nèi)聚和低耦合。
舉一些例子,我會IRepositoryBal完全忘記你和泛型,只是簡化整個事情:
//your going to struggle to do DI with internal classes, make them public
public class EmployeeBal : IEmployeeBal
{
//
}
public interface IEmployeeBal
{
void Add(Employee entity);
void Delete(Employee entity);
IEnumerable<Employee> GetAll();
Department Department {get; set;}
}
public class StickTogether
{
private readonly IEmployeeBal _employee;
private readonly IDepartmentBal _department;
public StickTogether(IEmployeeBal employee, IDepartmentBal department)
{
_employee = employee;
_department = department;
}
public void Create()
{
_employee.Add(new Employee());
_department.Add(new Department());
_employee.Department = _department; //not accessible which has a sense
}
}
然后,您可以在 DI 框架中配置這些,例如在簡單的 Injector 中,您將執(zhí)行以下操作:
Container _defaultContainer = new Container();
_defaultContainer.Register<IEmployeeBal, EmployeeBal>();
_defaultContainer.Register<IDepartmentBal, DepartmentBal>();
_defaultContainer.Register<IDepartmentDal, DepartmentDal>();
//..etc.
然后你得到你的父實例(僅?。┮虼耍?/p>
IEmployeeBal entryPoint = _defaultContainer.GetInstance<IEmployeeBal>();
DI 框架會完成剩下的工作,并且您的所有依賴項都已解耦。
- 1 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報