2011-08-16 75 views
1

我有項目calles倉庫。倉庫中有產品。我想寫一個選項來通知倉庫預期的產品。我正在考慮這樣做:使用單身人士和調解人爲了溝通項目

  1. 創建一個新的Warehose.Common項目,該項目將被願意與倉庫交互的其他項目引用。
  2. 在Warehose.Common項目中,我將創建一個產品接口並將其命名爲IProduct。
  3. 使用單和調解員設計模式如下(不知道我正確地實現這些設計模式):

    public sealed class ExpectedProductsMediator 
    { 
        private static volatile ExpectedProductsMediator _Instance; 
        private static object _SyncRoot = new Object(); 
    
    
        delegate IEnumerable<INoteProduct> ExpectedProductsGenerator(DateTime startDate, DateTime endDate); 
    
        private IList<ExpectedProductsGenerator> _ExpectedProductsGenerators; 
    
        private ExpectedProductsMediator() 
        { 
         _ExpectedProductsGenerators = new List<ExpectedProductsGenerator>(); 
        } 
    
        public static ExpectedProductsMediator Instance 
        { 
         get 
         { 
          if (_Instance == null) 
          { 
           lock (_SyncRoot) 
           { 
            if (_Instance == null) 
             _Instance = new ExpectedProductsMediator(); 
           } 
          } 
          return _Instance; 
         } 
        } 
    
        public void AddExpectedProductsGenerator(ExpectedProductsGenerator generator) 
        { 
         _ExpectedProductsGenerators.Add(generator); 
        } 
    
        public void RemoveExpectedProductsGenerator(ExpectedProductsGenerator generator) 
        { 
         _ExpectedProductsGenerators.Remove(generator); 
        } 
    
        public IEnumerable<INoteProduct> GetExpectedProducts(DateTime startDate, DateTime endDate) 
        { 
         IEnumerable<INoteProduct> products = null; 
         if (_ExpectedProductsGenerators.Any()) 
         { 
          products = _ExpectedProductsGenerators.First()(startDate, endDate); 
          foreach (ExpectedProductsGenerator generator in _ExpectedProductsGenerators.Skip(1)) 
          { 
           products = products.Concat(generator(startDate, endDate)); 
          } 
         } 
         return products; 
        } 
    } 
    

這調解人將在Warehouse.Common項目。現在,如果想提供期望的產品B項目,它需要使用AddExpectedProductsGenerator註冊其發電機()方法:

public static class ExpectedProductsRegistrar { 
    static ExpectedProductsRegistrar() { 
     ExpectedProductsMediator.Instance.AddExpectedProductsGenerator(someGenerator); 
    } 
} 

每當倉庫需要得到預期的產品的所有它需要做的就是調用GetExpectedProducts () 方法。

這個實現有兩個問題:
- 它暴露了GetExpectedProducts()方法到所有其他項目。
- 爲了註冊中介,我需要使用靜態約束。

您對我的實施有什麼看法?有這種需求的更好的解決方案嗎?我正確使用設計模式嗎?

回答

0

最終我使用了這個實現。我沒有找到更好的螞蟻這個代碼更容易保存。

1

我會讓你的API接受新的產品,然後寫入存儲(文件,DB等)。然後倉庫項目從存儲中讀取預期的產品。然後你可以擺脫你的單身人士,儘可能少地通過API暴露。

+0

將產品數據寫入存儲器是有問題的,因爲產品數據可能會不時變化。每當倉庫調用GetExpectedProducts()時,它都會獲取最新的更新產品。我不想處理編輯並移除調解器中的預期產品。實際上,用戶可以獲得預期的產品,然後將其手動轉換爲存儲在Warehouse項目的數據庫中的實際產品。 – Naor