没有使用Ninject Decorator

时间:2015-05-08 15:56:37

标签: ninject ninject-2 ninject.web.mvc

我想要做的是使用以下代码围绕命令包装装饰器。

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();
        }
    }
}

以下是我如何调用解析但我只返回没有decoratoration的ChangePasswordCommand。 (实际上它不会在第二个Bind上编译事件)

最终目标是使用此装饰器自动注册我的所有类型。任何帮助都会很棒!

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

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

1 个答案:

答案 0 :(得分:0)

你非常接近。但是:当你想使用装饰器时,你需要装饰器来实现与命令相同的接口。这就是这种情况,但您还需要解析该接口(并将其绑定)。所以这是它的工作原理:

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

var command = kernel.Get<ICommand<ChangePasswordArgs>>();