У меня есть проектные вызовы Склад. На складе есть Продукты. Я хочу написать опцию для информирования склада о ожидаемых продуктах. Именно так я и думаю об этом:с использованием синглтона и медиатора для связи между проектами
- Создайте новый проект Warehose.Common, на который будут ссылаться другие проекты, желающие взаимодействовать с складом.
- В проекте Warehose.Common я создам интерфейс для продукта и называю его IProduct.
Использование одноэлементные и медиатора шаблоны проектирования следующим образом (не уверен, что реализовать эти шаблоны проектирования правильно):
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() для всех других проектов.
- Чтобы зарегистрировать медиатор, мне нужно использовать статический констрактор.
Что вы думаете о моей реализации? Есть ли лучшее решение для таких потребностей? Я правильно использую шаблоны проектирования?
Написание данных о продуктах в хранилище проблематично, поскольку данные производителей могут время от времени меняться. Всякий раз, когда Warehouse вызывает GetExpectedProducts(), он получает последние обновленные продукты. Я не хочу обрабатывать редактирование и удаление ожидаемых продуктов в медиаторе. Фактически, пользователь получает ожидаемые продукты, а затем преобразовывает их вручную в реальные продукты, которые были сохранены в db проекта проекта Warehouse. – Naor