Ninject Decorator не используется

То, что я пытаюсь сделать, это обернуть декоратор вокруг команды, используя следующий код.

public interface ICommand
{
}

public interface ICommand<T> : ICommand where T : class
{
    void Execute(T args);
}

public class TransactionalCommand<T> : ICommand<T>
    where T : class
{
    private readonly ICommand<T> command;

    public TransactionalCommand(ICommand<T> command)
    {
        this.command = command;
    }

    public void Execute(T args)
    {
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
        {
            this.command.Execute(args);

            scope.Complete();
        }
    }
}

Вот как я вызываю разрешение, но я только возвращаю свою команду ChangePasswordCommand без декораций. (На самом деле это событие не скомпилируется при второй привязке)

Конечная цель состоит в том, чтобы автоматически регистрировать все мои типы с помощью этого декоратора. Любая помощь будет здорово!

        Bind<ChangePasswordCommand>().To<ChangePasswordCommand>()
            .WhenInjectedInto<TransactionalCommand<ChangePasswordArgs>>();
        Bind<ChangePasswordCommand>().To<TransactionalCommand<ChangePasswordArgs>>()
            .InTransientScope();

        var command = kernel.Get<ChangePasswordCommand>();

person Marco    schedule 08.05.2015    source источник


Ответы (1)


Вы были довольно близко. Однако: если вы хотите использовать декоратор, вам нужно, чтобы декоратор реализовал тот же интерфейс, что и команда. Здесь так и есть, но вам также потребуется разрешить этот интерфейс (и привязать его тоже). Итак, вот как это работает:

kernel.Bind<ICommand<ChangePasswordArgs>>().To<ChangePasswordCommand>()
    .WhenInjectedInto<TransactionalCommand<ChangePasswordArgs>>();
kernel.Bind<ICommand<ChangePasswordArgs>>().To<TransactionalCommand<ChangePasswordArgs>>()
    .InTransientScope();

var command = kernel.Get<ICommand<ChangePasswordArgs>>();
person BatteryBackupUnit    schedule 09.05.2015