0

我有一個跨層,Widget的業務層對象。我希望它在不同的圖層中公開一組不同的屬性。下面是如果編譯器閱讀評論它會怎樣看:圖層的可訪問性不能通過組裝

//bl.dll 

public abstract class Widget 
{ 
    //repo only 
    internal virtual Ppty_A {get;set;} //internal to implementation assembly of repo 

    //repo and service only 
    internal virtual Ppty_B {get;set;} //internal to implementation assemblies of repo/svc 

    //everyone inlcuding presentation 
    public virtual Ppty_C {get;set;} 
} 
public interface IWidgetService 
{ ... } } 
public interface IWidgetRepo 
{ ... } 
public class SimpleWidgetService : IWidgetService 
{ ... } 

//dal.dll 
using bl; 
public WidgetRepo 
{ ... } 

//presentation.dll 
using bl; 
public WidgetController 
{ 
    public WidgetController(IWidgetService ...) 
    ... 
} 

我的想法是這樣做(我沒有測試過這又和它只是解決了問題的一半):

//bl.dll 
public abstract class Widget 
{ 
    //repo only simply can't be defined in the abstraction -- can't see you => no contract 

    //repo and service only has to be public? 
    public virtual Ppty_B {get;set;} 

    //at least public is public... 
    public virtual Ppty_C {get;set;} 
} 

//dal.dll 
using bl; 
public SQLWidget : Widget //Or actually DALBLWidget -- see below? 
{ 
    //repo only 
    internal ... 
    internal ... 

    //the rest 
    ... 
} 

我應該創建另一個抽象的Widget(有一個DAL-BL Widget和一個BL-UI Widget)?

+0

你爲什麼要這個設計?爲每個圖層定製DTO並不是一個更好的主意,只需要傳遞所需的數據? – 2012-04-15 19:30:00

+0

我不知道有一個很好的選擇,當我不得不進行更改時,無痛地更新整個「列」。我的直覺是儘量減少代表同一實體的類型的數量(我希望只需要一個,對於ORM) – 2012-04-16 03:24:22

+0

通過更新整列來表示什麼意思? – 2012-04-16 07:13:21

回答

1

您可以讓Widget類實現與每個圖層對應的不同接口。

public class Widget : IDataLayerWidget, IBusinessLayerWidget 
{ 
// Properties 
} 

public interface IDataLayerWidget 
{ 
    // Properties visible to the DataLayer 
} 

public interface IBusinessLayerWidget 
{ 
    // Properties visible to the BusinessLayer 
} 

在你的數據層,你會與IDataLayerWidget並與IBusinessLayerWidget業務層的工作。

+0

不是我想到的,但我想要的是隔離。目前,我沒有看到這將如何防止表示層與「(IDataLayerWidget)Widget」或「(IBusinessLayerWidget)Widget」一起工作。 – 2012-04-16 03:31:15

+1

它沒有。如果你不想讓一個圖層訪問另一個圖層的數據,請不要讓該圖層訪問數據。 對於您的問題沒有完美的解決方案。要麼爲每個圖層都有單獨的窗口小部件並進行映射。這讓你分離。或者在所有圖層之間共享您的數據對象,並與高耦合共存。 – 2012-04-16 05:37:00

+0

@SebastianWeber,你的「是」答案是我必須忍受的。我也很樂意在這裏「接受」。 – 2012-04-18 03:28:58