2011-04-13 163 views
2

我有两个基本的接口如下,一个继承另一个。我为他们结合实现如下..ninject继承接口

public interface IUnitOfWork { } 
public interface IEventStoreUnitOfWork : IUnitOfWork { } 

public class TransactionalHandler<TCommand, TCommandHandler> { 
    public TransactionalHandler(IUnitOfWork unitOfWork) { 
      // removed 
    } 
} 

public class EventStoreUnitOfWork : IEventStoreUnitOfWork { } 

绑定...

Bind<IEventStoreUnitOfWork>().To<EventStoreUnitOfWork>(); 

Bind<TransactionalHandler<IDomainCommand, IDomainCommandHandler<IDomainCommand>>>() 
    .ToSelf() 
    .WithConstructorArgument("unitOfWork", Kernel.GetService(typeof(IEventStoreUnitOfWork))); 

这是行不通的。错误是:

Error activating IUnitOfWork 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
2) Injection of dependency IUnitOfWork into parameter unitOfWork of constructor of type TransactionalHandler{CreateUserCmd, CreateUserCmdHandler} 
1) Request for TransactionalHandler{CreateUserCmd, CreateUserCmdHandler} 

这是怎么回事?显然,IUnitOfWork由IEventStoreUnitOfWork继承,并且具有绑定。我事件尝试了这一点,但我得到了同样的错误...

Bind<TransactionalHandler<IDomainCommand, IDomainCommandHandler<IDomainCommand>>>() 
.ToSelf() 
.WithConstructorArgument("unitOfWork", Kernel.GetService(typeof(IEventStoreUnitOfWork)) as IUnitOfWork); 

任何想法?

谢谢

回答

1

该类型必须完全匹配。这意味着你需要绑定IUnitOfWork。搜索依赖关系时不考虑基本类型。

+0

我相信有这种明确性的理由,但是这没什么大不了的,我会一个很大的碱基结合接口。 – 2011-04-14 14:47:11

2

亚伦詹森有ninject叉它在github上认为基本类型,如果你是绝对需要这种行为

+0

谢谢,这会很好! – 2011-04-14 14:47:41