2010-06-09 31 views
5

Tôi muốn tiêm một thực hiện giao diện của tôi trong WCF nhưng tôi muốn khởi tạo container Dependency Injection của tôi trong Client của WCF. Vì vậy, tôi có thể có một triển khai khác nhau cho từng khách hàng của dịch vụ của tôi.Dependency Injection wcf

Trả lời

16

Khi bạn sử dụng svcutil.exe hoặc Thêm dịch vụ tham khảo thuật sĩ trong Visual Studio, một trong nhiều loại tự động tạo ra sẽ là một giao diện khách hàng. Hãy gọi nó là IMyService. Cũng sẽ có một giao diện được tạo tự động khác được gọi là được gọi là IMyServiceChannel triển khai IMyService và IDisposable. Sử dụng sự trừu tượng này trong phần còn lại của ứng dụng khách của bạn.

Vì bạn muốn để có thể tạo ra một kênh mới và đóng nó lại một lần nữa, bạn có thể giới thiệu một Factory Tóm tắt:

public interface IMyServiceFactory 
{ 
    IMyServiceChannel CreateChannel(); 
} 

Trong phần còn lại của ứng dụng khách hàng của bạn, bạn có thể tham gia một sự phụ thuộc vào IMyServiceFactory:

public class MyClient 
{ 
    private readonly IMyServiceFactory factory; 

    public MyClient(IMyServiceFactory factory) 
    { 
     if (factory == null) 
     { 
      throw new ArgumentNullException("factory"); 
     } 

     this.factory = factory; 
    } 

    // Use the WCF proxy 
    public string Foo(string bar) 
    { 
     using(var proxy = this.factory.CreateChannel()) 
     { 
      return proxy.Foo(bar); 
     } 
    } 
} 

Bạn có thể tạo ra một thực hiện cụ thể của IMyServiceFactory rằng kết thúc tốt đẹp WCF của ChannelFactory<T> như một thực hiện:

public MyServiceFactory : IMyServiceFactory 
{ 
    public IMServiceChannel CreateChannel() 
    { 
     return new ChannelFactory<IMyServiceChannel>().CreateChannel(); 
    } 
} 

Bây giờ bạn có thể định cấu hình DI Container của mình bằng cách ánh xạ IMyServiceFactory thành MyServiceFactory. Dưới đây là cách thực hiện trong Castle Windsor:

container.Register(Component 
    .For<IMyServiceFactory>() 
    .ImplementedBy<MyServiceFactory>()); 

Thông tin bổ sung: Đây là how to wire up a WCF service with a DI Container.

+1

Ok, nhưng Làm cách nào để tiêm dịch vụ thực hiện tùy chỉnh một lớp học? Ví dụ: giao diện công cộng ISendMail {seng (chuỗi chủ đề, chuỗi tin nhắn, chuỗi đến); }. Tôi muốn thực hiện một lớp khác nhau cho mỗi khách hàng và trong khách hàng tôi tiêm thực hiện này trong WCF Service. Tks –

+0

Mã có thể không thể hiện sự phức tạp về chu kỳ hoặc từ thông báo khác, nhưng những gì tôi biết là, được lấy ở dạng hiện tại, điều này đòi hỏi rất nhiều thứ nếu bạn có nhiều dịch vụ mà bạn quan tâm. đòi hỏi một cách tiếp cận chung chung hơn để có giá trị trong các dự án lớn hơn, IMO. – brumScouse

+2

Bạn tiếp tục sử dụng từ đó. Tôi không nghĩ rằng nó có nghĩa là những gì bạn nghĩ rằng nó có nghĩa là. –

1

Dưới đây là những gì tôi hiểu từ câu hỏi của bạn:

Bạn có một giao diện mà không liên quan đến WCF. Hãy gọi nó là IInterface

Bạn có ứng dụng khách WCF đã sử dụng dịch vụ. Hãy gọi hợp đồng dịch vụ: IService

bạn muốn lớp ServiceClient theo mặc định triển khai IService khi bạn thêm tham chiếu dịch vụ cũng để triển khai IInterface.

Nếu đây là trường hợp, bạn có thể sử dụng thực tế là lớp ServiceClient được đánh dấu là một phần.

Chỉ cần thực hiện khai báo một phần khác cho ServiceClient và thêm giao diện bạn cần (Bạn phải đảm bảo rằng các không gian tên bằng nhau cho mã được tạo tự động và mã của bạn). Hình ảnh trông giống như sau:

namespace [ServiceClient Namespace] 
{ 
    public partial class ServiceClient : IInterface 
    { 
    } 
} 

Hy vọng điều đó sẽ hữu ích.

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