использование синглтона и посредника для связи между проектами - PullRequest
1 голос
/ 16 августа 2011

У меня есть проект Calle Warehouse.На складе есть Товары.Я хочу написать опцию, чтобы сообщить склад о предполагаемых продуктах.Вот как я собираюсь это сделать:

  1. Создайте новый проект Warehose.Common, на который будут ссылаться другие проекты, которые хотят взаимодействовать со складом.
  2. На складе.Общий проект Я создам интерфейс для Product и назову его IProduct.
  3. Используйте шаблоны проектирования singleton и посредника следующим образом (не уверен, что я правильно реализовал эти шаблоны проектирования):

    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 () для всех других проектов.
- Для регистрации посредника мне нужноиспользовать статический конструктор.

Что вы думаете о моей реализации?Есть ли лучшее решение для такой необходимости?Правильно ли я использую шаблоны проектирования?

Ответы [ 2 ]

1 голос
/ 16 августа 2011

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

0 голосов
/ 21 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...