2011-08-16 1 views
1

У меня есть проектные вызовы Склад. На складе есть Продукты. Я хочу написать опцию для информирования склада о ожидаемых продуктах. Именно так я и думаю об этом:с использованием синглтона и медиатора для связи между проектами

  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

В конце концов я использовал эту реализацию. Я не нашел что-то лучшего, и этот код будет проще для maitain.

1

Я бы хотел, чтобы ваш API принимал новые продукты, а затем записывал их на хранение (файл, DB и т. Д.). Затем проект Warehouse считывает ожидаемые продукты из хранилища. Затем вы можете избавиться от своего синглтона и максимально разоблачить его через API.

+0

Написание данных о продуктах в хранилище проблематично, поскольку данные производителей могут время от времени меняться. Всякий раз, когда Warehouse вызывает GetExpectedProducts(), он получает последние обновленные продукты. Я не хочу обрабатывать редактирование и удаление ожидаемых продуктов в медиаторе. Фактически, пользователь получает ожидаемые продукты, а затем преобразовывает их вручную в реальные продукты, которые были сохранены в db проекта проекта Warehouse. – Naor

Смежные вопросы