32

Tôi có tình hình (giản thể) sau: Tôi có hai giao diệnCó thể liên kết các giao diện khác nhau với cùng một cá thể của một lớp đang triển khai tất cả chúng không?

interface IAmAnInterface 
{ 
    void DoSomething(); 
} 

interface IAmAnInterfaceToo 
{ 
    void DoSomethingElse(); 
} 

và một lớp học thực hiện cả hai:

class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo 
{ 
    public IAmAnImplementation() 
    { 
    } 

    public void DoSomething() 
    { 
    } 

    public void DoSomethingElse() 
    { 
    } 
} 

Bây giờ tôi ràng buộc cùng lớp để cả hai giao diện sử dụng Ninject. Vì tôi muốn cùng một ví dụ của IAmAnImplementation ong được sử dụng cho IAmAnInterface cũng như IAmAnInterfaceToo rõ ràng là tôi cần một số loại singleton. Tôi chơi xung quanh với ninject.extensions.namedscope cũng như InScope() nhưng không thành công. thử cuối cùng của tôi là:

Bind<IAmAnImplementation>().ToSelf().InSingletonScope(); 
Bind<IAmAnInterface>().To<IAmAnImplementation>().InSingletonScope(); 
Bind<IAmAnInterfaceToo>().To<IAmAnImplementation>().InSingletonScope(); 

Nhưng tiếc là khi tôi yêu cầu một thể hiện của lớp thử nghiệm của tôi qua kernel.Get<IDependOnBothInterfaces>(); nó trong thực tế sử dụng các trường hợp khác nhau của IAmAnImplementation.

class IDependOnBothInterfaces 
{ 
    private IAmAnInterface Dependency1 { get; set; } 
    private IAmAnInterfaceToo Dependency2 { get; set; } 

    public IDependOnBothInterfaces(IAmAnInterface i1, IAmAnInterfaceToo i2) 
    { 
     Dependency1 = i1; 
     Dependency2 = i2; 
    } 

    public bool IUseTheSameInstances 
    { 
     get { return Dependency1 == Dependency2; } // returns false 
    } 
} 

Có cách nào nói Ninject sử dụng cùng một ví dụ của IAmAnImplementation cho IAmAnInterface cũng như IAmAnInterfaceToo?

+0

liên quan: Xem [này câu hỏi V2 thời] (http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services -in-ninject) để thảo luận quá chi tiết về các cách tiếp cận không hợp lệ cũ –

Trả lời

88

Nó là rất dễ dàng sử dụng V3.0.0

Bind<I1, I2, I3>().To<Impl>().InSingletonScope(); 
+0

+1 Tôi không biết điều này trong 3.0 :) rất tốt để biết. –

+0

+1 cảm ơn. Trong thực tế, tôi đang sử dụng 3,0 vì vậy tôi sẽ đi cho giải pháp này. – Silas

+6

Nếu bạn có nhiều hơn 4 giao diện: 'Ràng buộc (I1, I2, I3, I4, I5) .Để () .InSingletonScope();' – Jerome

Các vấn đề liên quan