2012-10-19 67 views
1

Ninject(最新版本)可能将接口绑定到特定类中的类型?通过我的意思是...让我说我有两个类..可能将接口绑定到特定类中的类型?

ClassA和ClassB,都在构造函数IContext注入..有可能说的绑定类型IContext到ContextA的ClassA和IContext到ContextB到ClassB ?

回答

3

而不是使用命名绑定也可以使用需要更少的代码,更类型安全条件的绑定:

Bind<IContext>().To<ContextA>().WhenInjectedInto<SomeClassThatNeedsAContext>(); 
Bind<IContext>().To<ContextB>().WhenInjectedInto<SomeOtherClassThatNeedsBContext>(); 
+0

最简单! +1这是我认为的更好的答案。需要更少的代码。 – Rushino

+0

这很酷,我以前没见过这个语法,非常有用。 – Brook

+0

@布鲁克不用担心你的回答很好。 :)其实有3个原因,我选择了这个答案。 1-更直观。我个人尝试避免魔术串。 3较少的代码。 – Rushino

1

执行此操作的一种方法是使用命名绑定。

kernel.Bind<IContext>().To<ContextA>().Named("A"); 
kernel.Bind<IContext>().To<ContextB>().Named("B"); 

kernel.Bind<SomeClassThatNeedsContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<IContext>("A")); 
kernel.Bind<SomeOtherClassThatNeedsContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<IContext>("B")); 

另一种方式可能是只使用了“WithConstructorArgument”本身

kernel.Bind<SomeClassThatNeedsAContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<ContextA>()); 

只是为了避免混淆,Ninject有上下文的概念为好,不要混淆与您提供的样本IContext等

我从经验中发现的一件事情是,如果我发现自己做这件事,我的界面或类设计中就有一个缺陷。也许你真的需要两个不同的界面?

+0

罗.. IContext在我的情况表示上下文来访问特定的数据库。它只是我在我的项目中为特定的类使用另一个数据库,所以我必须将其他上下文注入到它的存储库中。这就是为什么我不能有2接口加上它没有意义,我有2个接口。基础知识库正在使用IContext。这个想法是能够将一个上下文传递给包含连接字符串的主存储库(从配置文件中获取)。这使我能够为一个项目提供多个数据库。 – Rushino

相关问题