第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

三層架構(gòu)方法和設(shè)計方法

三層架構(gòu)方法和設(shè)計方法

C#
小唯快跑啊 2021-12-25 16:31:30
我正在嘗試使用 ado.net 和 sql server 設(shè)計我的應(yīng)用程序架構(gòu)。我考慮使用以下三個層:表示層 -> 業(yè)務(wù)層 (BAL) -> 數(shù)據(jù)訪問層 (DAL)示例對象的實體,如員工、部門等。我正在嘗試使用接口作為我的一些類的契約。我目前的問題是,我看到一些方法在 BAL 和 DAL 對象之間是通用的,例如:Add、Remove、GetAll 因此我決定創(chuàng)建接口來實現(xiàn)這些東西但是當(dāng)從 BAL 類使用時我需要像void Add(Employee)但在 DAL 中void Add(string name);因此我在 DAL 和 BAL 上拆分了幾乎相同的接口(我不喜歡它,因為它似乎以某種方式重復(fù)了)。下一個問題是當(dāng)我想在StickTogether class我無法調(diào)用時 使用我的代碼時,_employee.Department = _department;我知道這是因為Department property應(yīng)該在RepositoryBal接口中,但在簡單實體中Department需要實現(xiàn)我不想做的這樣的接口,因為就我而言,實體只是特定對象的簡單重復(fù)。你能告訴我 - 最好的例子展示你將如何創(chuàng)建這樣的架構(gòu)或修改我的東西以擁有比我現(xiàn)在更好的東西。下面找到我正在處理的完整代碼。如何解決這個問題?請注意,我也開始為依賴準(zhǔn)備此代碼,這將有助于 moc 測試。使用基于我的代碼提出的固定解決方案感謝您的回答。
查看完整描述

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 框架會完成剩下的工作,并且您的所有依賴項都已解耦。


查看完整回答
反對 回復(fù) 2021-12-25
  • 1 回答
  • 0 關(guān)注
  • 181 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號