簡體   English   中英

如何抽象Entity Framework模型屬性

[英]How to abstract Entity Framework model properties

我有一個看起來像這樣的模型:

public class Task : ITask
{
    public int DocumentId { get; set; }
    public virtual Document Document { get; set; }
    public TaskType TaskType { get; }
    public string Value { get; }
}

現在,此類在DbSet中直接注冊為DbContext 這意味着Document屬性必須是具體類型。 我想讓這段代碼很容易測試,所以我希望將屬性作為ITask接口所需的接口。 解決這個問題的一般方法是什么?

我想到的一種方法是將所有這些類放在一個單獨的程序集中,但這似乎有點過時了。

編輯: ITask接口在不同的程序ITask定義,因此它不應該知道Document類型。

我只將EF模型用於數據訪問層,並為業務層創建單獨的模型。 數據訪問層負責將EF模型映射到業務層模型並將其交給業務層。

然后,業務層模型也可以是不可變的,這可以具有優勢。 此外,您可以要求所有屬性在構造函數中為非null,然后您可以在整個業務層中依賴於此。

當然你可以說它幾乎是編寫代碼的兩倍。 這是真的,但IMO會產生更清晰的代碼,因此這是我的首選方法。

接口可以在其中定義屬性,因此您的ITask可以指定文檔,如下所示:

public interface ITask {
    Document Document { get; set; }
}

但是你也說你想把Document屬性作為一個接口,這就變得很棘手,因為你需要Task類中的具體類型。 通用接口在這里會有所幫助。

// The interfaces
public interface ITask<TDocument> where TDocument : IDocument, new() {
     TDocument Document { get; set; }
}

public interface IDocument {
    int Number { get; set; } // Example property
}


//The classes
public class Document : IDocument{
    public int Number { get; set; } // Example property
}

public class Task : ITask<Document> {
    public Document Document { get; set; }
}


// See if it works
public class Test {
    private Task myTask = new Task();

    public void TestMethod() {
        myTask.Document.Number = 1;
    }
}

請記住,在DBContext中使用具體類型。

至於接口應該位於何處,相同的裝配或它們自己的位置,對此有很多觀點。 就個人而言,我把它們放在遠離實施類的自己的程序集中。 這個問題值得一讀: 我應該有一個單獨的接口程序集嗎?

還有一個注釋,類名稱Task在.Net線程庫中使用,因此可能值得考慮更改它以避免潛在的混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM