Использование стратегии и заводской схемы с инъекцией зависимостиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Использование стратегии и заводской схемы с инъекцией зависимости

Сообщение Anonymous »

Я работаю над побочным проектом, чтобы лучше понять инверсию контроля и инъекции в зависимости и различных дизайнов. реализация . В результате я обнаруживаю, что объявляю все возможные интерфейсы в точке входа в службу и передавая их через приложение. В результате точка входа должна быть изменена для новых и различных реализаций класса стратегии. Мой стек для этого проекта - .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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Заводской заводской заводчик с правильной подписью
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Заводской заводской заводчик с правильной подписью
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Какое основное различие между инъекцией зависимости Dagger 2 и рукояти в Android Kotlin?
    Anonymous » » в форуме Android
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Итеративный алгоритм на основе классов с шаблоном стратегии с шаблоном стратегии
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Как можно извлечь конструкцию объекта из заводской функции?
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»