Лучший способ использовать StructureMap для реализации Стратегической модели

Почему использование регистратора Python вместо django-входа? Дайте ему попытку, это могло бы просто решить Вашу проблему.

http://code.google.com/p/django-logging/wiki/Overview

В данный момент это только позволило бы просматривать корневой регистратор, но Вы можете верная запись к нескольким регистраторам.

8
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

One common way to implement this is as Mark described. You have a class that takes in an array of all concrete instances (it must be an array for StructureMap to behave as expected), and then uses some logic to figure out which instance to use.

Some sample code you can paste into a console program or unit test:

var container = new Container(x => x.Scan(scan =>
{
    scan.TheCallingAssembly();
    scan.WithDefaultConventions();
    scan.AddAllTypesOf<IDiscountCalculator>();
}));
var strategy = container.GetInstance<IDiscountStrategy>();
Console.WriteLine(strategy.GetDiscount("Regular", 10)); // 0
Console.WriteLine(strategy.GetDiscount("Normal", 10)); // 1
Console.WriteLine(strategy.GetDiscount("Special", 10)); // 5

which depends on the following types:

public interface IDiscountStrategy 
{
    decimal GetDiscount(string userType, decimal orderTotal);
}

public class DiscountStrategy : IDiscountStrategy
{
    private readonly IDiscountCalculator[] _discountCalculators;

    public DiscountStrategy(IDiscountCalculator[] discountCalculators)
    {
        _discountCalculators = discountCalculators;
    }

    public decimal GetDiscount(string userType, decimal orderTotal)
    {
        var calculator = _discountCalculators.FirstOrDefault(x => x.AppliesTo(userType));
        if (calculator == null) return 0;
        return calculator.CalculateDiscount(orderTotal);
    }
}

public interface IDiscountCalculator
{
    bool AppliesTo(string userType);
    decimal CalculateDiscount(decimal orderTotal);
}

public class NormalUserDiscountCalculator : IDiscountCalculator
{
    public bool AppliesTo(string userType)
    {
        return userType == "Normal";
    }

    public decimal CalculateDiscount(decimal orderTotal)
    {
        return orderTotal * 0.1m;
    }
}

public class SpecialUserDiscountCalculator : IDiscountCalculator
{
    public bool AppliesTo(string userType)
    {
        return userType == "Special";
    }

    public decimal CalculateDiscount(decimal orderTotal)
    {
        return orderTotal * 0.5m;
    }
}
11
ответ дан 5 December 2019 в 08:53
поделиться

Я бы сказал, что это не основная цель DI, а именно подключение и внедрение зависимостей, какими бы они ни были. Никакая прикладная логика не должна участвовать в подключении компонентов - она ​​должна строго основываться на конфигурации; либо кодом, либо файлом .config. Эта конфигурация распространяется на все приложение, поэтому довольно сложно определить конфигурацию, которая зависит от пользователя.

Тем не менее, то, о чем вы спрашиваете, хорошо сочетается с DI - это просто немного перпендикулярно самому DI.

1290] Для вашей конкретной цели я бы определил новую зависимость в форме интерфейса или абстрактного базового класса. Это будет стратегия, которая выбирает правильные конкретные типы (те, которые вы хотите изменить) в зависимости от текущего пользователя.

8
ответ дан 5 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: