簡體   English   中英

如何在工廠中使用存儲庫

[英]How to use repository in factory

嗨,我正在嘗試按照DDD進行應用。 我有以下實體:

public class Item 
{
       public Category Category { get; protected set; }

       ...
}

public class SpecificItem : Item
{
       ...
}

public class Category 
{
       public static int IdOfCategoryForSpecificItem = 10;

       public int Id { get; set; }
}

現在我想用創建ObjectItem類型對象的方法創建工廠 但是這個特定項目必須屬於特定類別。 所以我創建了這樣的工廠:

public class ItemFactory
{
       public static SpecificItem CreateSpecificItem(object someArguments)
       {
            IRepository<Category> repository = null // How to get repository?

            return new SpecificItem
            {
                 Category = repository.FirstOrDefault(i => i.Id == Category.IdOfCategoryForSpecificItem),
                 // additional initialization
            };
       }
}

現在我的問題是:

  1. 這是創建工廠和使用存儲庫的正確方法嗎?
  2. 如何獲得存儲庫? 我不能使用DI,因為它是靜態方法。 我不喜歡ServiceLocator,因為它很難進行單元測試。
  3. 也許這個問題有更好的解決方案。

重寫您的ItemFactory以使用依賴注入並使用構造函數注入注入IRepository<Category> 完成后, ItemFactory將如下所示:

public class ItemFactory
{
    private readonly IRepository<Category> repository;

    public ItemFactory(IRepository<Category> repository)
    {
        this.repository = repository;
    }

    public SpecificItem CreateSpecificItem(object someArguments)
    {
        return new SpecificItem
        {
             Category = this.repository.FirstOrDefault(i => 
                 i.Id == Category.IdOfCategoryForSpecificItem),
             // additional initialization
        };
    }
}

這樣,您就可以將檢索IRepository<Category>的實現的責任移交給調用者。 現在,您可以對需要ItemFactory所有類型執行相同ItemFactory 在這些類型的構造函數中將ItemFactory注入為依賴項。 這樣做一直到應用程序的類型層次結構的頂部,並組成他們的類型( 組合根 )。

特別是IoC / DI框架將非常方便為您自動創建類型。

我建議制作DaoService課程。 當Dao組織對數據的訪問時,Service使用Dao來管理數據。 架構是:
1)Dao-class正在訪問數據
2)服務類正在形成存儲庫
3)服務級為您的工廠提供存儲庫
這是非常通用的架構,但我希望我的回答能幫到你。

我認為這是一個令人費解語法的時代正在引導您走向更好的解決方案。

您可能希望每個類都有一個不同的存儲庫,這正是DI可以為您做的以及靜態屬性將阻止的。

但我也認為你在這里混淆了你的名字 - 一個工廠創造了某種類型的新物品,而一個工廠存儲/持久存儲該類型的物品。 你在創建還是檢索?

我的建議是將它們分開 - 實現一個工廠來創建新工廠和一個存儲庫來保存/檢索現有工廠。 使用DI根據運行時的類型確定哪種具體實現。

暫無
暫無

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

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