Как вставить словарь с помощью Ninject [duplicate]

Что вы спрашиваете, почему это:

def func(a=[], b = 2):
    pass

не является внутренне эквивалентным этому:

def func(a=None, b = None):
    a_default = lambda: []
    b_default = lambda: 2
    def actual_func(a=None, b=None):
        if a is None: a = a_default()
        if b is None: b = b_default()
    return actual_func
func = func()

, за исключением случая прямого вызова func (None , None), которые мы будем игнорировать.

Другими словами, вместо оценки параметров по умолчанию, почему бы не сохранить их каждый из них и оценить их при вызове функции?

Один ответ, вероятно, прямо там - он фактически превратит каждую функцию с параметрами по умолчанию в закрытие. Даже если это все скрыто в интерпретаторе, а не полномасштабное закрытие, данные должны быть где-то сохранены. Он будет медленнее и будет использовать больше памяти.

4
задан abatishchev 29 August 2011 в 13:06
поделиться

2 ответа

Я предполагаю, что это фиксированный список. Самый простой способ был бы с провайдером:

    public class MyProvider :  IProvider
    {
        public object Create(IContext context)
        {
            return new Dictionary<string, IMyInterface>{
               {"alpha", context.Kernel.Get<ImpClassOne>()},
               {"beta", context.Kernel.Get<ImplClassTwo>()}
            }
        }

        public Type Type
        {
            get { return typeof(IDictionary<string, IMyInterface>); }
        }
    } 

Вы можете зарегистрировать провайдера в своем ядре, например:

   kernel.Bind<IDictionary<string, IMyInterface>>().ToProvider<MyProvider>();

, а затем [Inject] для свойства будет использовать провайдер для создания словаря.

4
ответ дан ryber 20 August 2018 в 18:00
поделиться
  • 1
    Спасибо, все еще изучая Ninject и еще не знал о провайдерах. – Ronald Wildenberg 19 September 2011 в 07:16

В случае, если ключ можно каким-то образом получить / сгенерировать / вычитать из IMyInterface, например. из свойства Name, тогда есть простое решение.

public class DictionaryProvider : Provider<IDictionary<string, IMyInterface>>
{
    private IEmumerable<IMyInterface> instances;
    public DictionaryProvider(IEmumerable<IMyInterface> instances>)
    {
        this.instances = instances;
    }

    protected override IDictionary<string, IMyInterface> CreateInstance(IContext context)
    {
        return this.instances.ToDictionary(i => i.Name);
    }
}

В противном случае решение ryber, вероятно, является самым простым способом.

3
ответ дан Remo Gloor 20 August 2018 в 18:00
поделиться
Другие вопросы по тегам:

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