2010-11-16 47 views
18

我已經例如2個interfases IInterface1IInterface2綁定一個班的幾個接口,單

public interface IInterface1 {...} 
public interface IInterface2 {...} 

和一個實現這些接口ImplClass的。

public class ImplClass : IInterface1, IInterface2 {...} 

我必須要確保應用程序只有一個ImplClass,這將作爲IInterface1和IInterface2的實例。 我正在使用ninject進行依賴注入。所以我的問題是:下面的代碼是否符合我的要求?

... 
Bind<IInterface1>().To<ImplClass>().Using<SingletonBehavior>(); 
Bind<IInterface2>().To<ImplClass>().Using<SingletonBehavior>(); 
... 

或者這段代碼會創建兩個ImplClass實例,用於eash接口?

+0

http://stackoverflow.com的重複/ questions/3147996/binding-single-to-multiple-services-in-ninject – Pete 2010-11-16 16:28:14

+0

@Pete你真的可以投票結束(好的叫BTW) – 2012-09-12 19:18:56

回答

19

隨着Ninject你可以這樣做:

var impl = new Impl(); 
container.Bind<IInt1>().ToMethod(c => impl); 
container.Bind<IInt2>().ToMethod(c => impl); 

Impl類有依賴關係,你不能Ninject注入,你可以這樣做:

container.Bind<Impl>().ToSelf().InSingletonScope(); 
container.Bind<IInt1>().ToMethod(c => c.Kernel.Get<Impl>()); 
container.Bind<IInt2>().ToMethod(c => c.Kernel.Get<Impl>()); 

不錯,乾淨。

+0

我喜歡它。您不必將該課程設置爲實際的單身人士,但您保證只提供一個實例。 – KeithS 2010-11-16 15:11:25

+0

使用ActivationContext時這不起作用。 – 2012-02-22 00:23:24

+0

-1由於每個解決方案都導致激活,因此不是很好的通用解決方案,請參閱http://stackoverflow.com/questions/3043441/prevent-ninject-from-calling-initialize-multiple-times-when-binding-to-several -i – 2012-09-12 08:24:01

1

我會懷疑這會創建兩個實例。

嘗試下面的結構是否適合你:

public class ImplClass : IInterface1, IInterface2 
{ 
    public static readonly ImplClass Instance = new ImplClass(); 
} 

下面的結合:

Bind<IInterface1>().ToMethod(c => ImplClass.Instance); 
Bind<IInterface2>().ToMethod(c => ImplClass.Instance); 
+2

好的答案和+1,但IMO部分IoC框架的優勢在於,您可以設置一個單例對象,而無需實際將類結構定義爲單例(稍後可以更輕鬆地改變主意,或者在不同的位置設置容器或工廠範圍的註冊)環境)。如果他只是在Binding類中初始化一個類並將其註冊爲單實例範圍呢? (我不太瞭解Ninject的功能,但Autofac在這方面不會有任何問題)。 – KeithS 2010-11-16 15:09:14

5

看來你還在使用Ninject 1.5。我沒有帶記住確切的語法了,但應該similat到2.1以下語法:

kernel.Bind<I1>().ToMethod(ctx => ctx.Kernel.Get<Impl>()); 
kernel.Bind<I2>().ToMethod(ctx => ctx.Kernel.Get<Impl>()); 
kernel.Bind<Impl>().ToSelf().InSingletonScope(); 

甚至更​​好使用Ninject.Extensions.ContextPreservation保持上下文。

kernel.Bind<Impl>().ToSelf().InSingletonScope(); 
kernel.BindInterfaceToBinding<I1, Impl>(); 
kernel.BindInterfaceToBinding<I2, Impl>(); 
+0

使用ActivationContext時這不起作用。 – 2012-02-22 00:23:34

+0

@JeffWalkerCodeRanger請解釋 – 2012-02-22 18:10:08

+0

已經upvoted,想改變爲downvote的基礎上它的http://stackoverflow.com/a/4195510/11635(和哈相同的多個激活問題) – 2012-09-12 08:23:16