Я работаю над побочным проектом, чтобы лучше понять инверсию контроля и инъекции в зависимости и различных дизайнов. реализация . В результате я обнаруживаю, что объявляю все возможные интерфейсы в точке входа в службу и передавая их через приложение. В результате точка входа должна быть изменена для новых и различных реализаций класса стратегии. Мой стек для этого проекта - .NET 4.5/C# и Unity для IOC/DI. Существуют разные расчеты для ИБП, DHL и FedEx, и каждая запланированность может или не может полагаться на дополнительные услуги (для достижения базы данных, API и т. Д.). < /P>
public class Order
{
public string ShippingMethod { get; set; }
public int OrderTotal { get; set; }
public int OrderWeight { get; set; }
public int OrderZipCode { get; set; }
}
< /code>
Фиктивная программа или услуга для расчета стоимости доставки < /strong> < /p>
public class Program
{
// register the interfaces with DI container in a separate config class (Unity in this case)
private readonly IShippingStrategyFactory _shippingStrategyFactory;
public Program(IShippingStrategyFactory shippingStrategyFactory)
{
_shippingStrategyFactory = shippingStrategyFactory;
}
public int DoTheWork(Order order)
{
// assign properties just as an example
order.ShippingMethod = "Fedex";
order.OrderTotal = 90;
order.OrderWeight = 12;
order.OrderZipCode = 98109;
IShippingStrategy shippingStrategy = _shippingStrategyFactory.GetShippingStrategy(order);
int shippingCost = shippingStrategy.CalculateShippingCost(order);
return shippingCost;
}
}
// Unity DI Setup
public class UnityConfig
{
var container = new UnityContainer();
container.RegisterType();
// also register IWeightMappingService and IZipCodePriceCalculator with implementations
}
public interface IShippingStrategyFactory
{
IShippingStrategy GetShippingStrategy(Order order);
}
public class ShippingStrategyFactory : IShippingStrategyFactory
{
public IShippingStrategy GetShippingStrategy(Order order)
{
switch (order.ShippingMethod)
{
case "UPS":
return new UPSShippingStrategy();
// The issue is that some strategies require additional parameters for the constructor
// SHould the be resolved at the entry point (the Program class) and passed down?
case "DHL":
return new DHLShippingStrategy();
case "Fedex":
return new FedexShippingStrategy();
default:
throw new NotImplementedException();
}
}
}
< /code>
теперь для интерфейса и реализаций стратегии.public interface IShippingStrategy
{
int CalculateShippingCost(Order order);
}
public class UPSShippingStrategy : IShippingStrategy()
{
public int CalculateShippingCost(Order order)
{
if (order.OrderWeight < 5)
return 10; // flat rate of $10 for packages under 5 lbs
else
return 20; // flat rate of $20
}
}
public class DHLShippingStrategy : IShippingStrategy()
{
private readonly IWeightMappingService _weightMappingService;
public DHLShippingStrategy(IWeightMappingService weightMappingService)
{
_weightMappingService = weightMappingService;
}
public int CalculateShippingCost(Order order)
{
// some sort of database call needed to lookup pricing table and weight mappings
return _weightMappingService.DeterminePrice(order);
}
}
public class FedexShippingStrategy : IShippingStrategy()
{
private readonly IZipCodePriceCalculator _zipCodePriceCalculator;
public FedexShippingStrategy(IZipCodePriceCalculator zipCodePriceCalculator)
{
_zipCodePriceCalculator = zipCodePriceCalculator;
}
public int CalculateShippingCost(Order order)
{
// some sort of dynamic pricing based on zipcode
// api call to a Fedex service to return dynamic price
return _zipCodePriceService.CacluateShippingCost(order.OrderZipCode);
}
}
< /code>
Проблема с вышеизложенным заключается в том, что каждая стратегия требует дополнительных и различных служб для выполнения метода «CalculateshippingCost». Неужели эти интерфейсы /реализации должны быть зарегистрированы в точке входа (класс программы) и переданы через конструкторы? Может быть, что-то, что Unity мог бы обработать конкретно (https://msdn.microsoft.com/en-us/librar ... p.30).aspx)?p>
Я очень ценю любую помощь или щетку в правом направлении.>
Подробнее здесь: https://stackoverflow.com/questions/424 ... -injection
Использование стратегии и заводской схемы с инъекцией зависимости ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Какое основное различие между инъекцией зависимости Dagger 2 и рукояти в Android Kotlin?
Anonymous » » в форуме Android - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Итеративный алгоритм на основе классов с шаблоном стратегии с шаблоном стратегии
Anonymous » » в форуме Python - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-