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