2013-08-07 36 views
10

Tôi có một dịch vụ WCF mà thực hiện hai hợp đồng dịch vụ ...Làm thế nào để đăng ký hai hợp đồng dịch vụ WCF với autofac

public class MyService : IService1, IService2 

và tôi tự lưu trữ các dịch vụ ...

host = new ServiceHost(typeof(MyService)); 

Mọi thứ đều hoạt động tốt khi dịch vụ chỉ thực hiện một hợp đồng dịch vụ, nhưng khi tôi cố gắng thiết lập autofac để đăng ký cả hai như sau:

host.AddDependencyInjectionBehavior<IService1>(_container); 
host.AddDependencyInjectionBehavior<IService2>(_container); 

... nó ném một ngoại lệ vào thứ hai, báo cáo:

Không thể thêm giá trị vào bộ sưu tập vì bộ sưu tập đã chứa một mục cùng loại: 'Autofac.Integration.Wcf. AutofacDependencyInjectionServiceBehavior '. Bộ sưu tập này chỉ hỗ trợ một phiên bản của từng loại.

Thoạt nhìn, tôi nghĩ điều này đã được nói hai hợp đồng của tôi đã bằng cách nào đó được coi là cùng loại nhưng trên bài đọc thứ hai tôi tin rằng nó được nói rằng AutofacDependencyInjectionServiceBehavior là loại trong câu hỏi, ví dụ: Tôi không thể sử dụng nó hai lần!

Tuy nhiên, tôi thấy rằng this post một cách rõ ràng cho thấy sử dụng nó nhiều lần trong một hình thức hơi khác nhau:

foreach (var endpoint in host.Description.Endpoints) 
{ 
    var contract = endpoint.Contract; 
    Type t = contract.ContractType; 
    host.AddDependencyInjectionBehavior(t, container); 
} 

Thật không may, điều đó đã được thông báo lỗi rất giống nhau.

Có thể đăng ký nhiều hợp đồng dịch vụ trên một dịch vụ không và nếu có thì làm cách nào?

Trả lời

7

Trong thực tế, bạn có thể đăng ký nhiều thiết bị đầu cuối cho một máy chủ duy nhất với Autofac.

Đó là sự thật mà bạn không thể thêm nhiều AutofacDependencyInjectionServiceBehavior nhưng hành vi này lặp qua tất cả các thiết bị đầu cuối và đăng ký chúng trong ApplyDispatchBehavior phương pháp: source

Để thực hiện việc này, bạn cần phải đăng ký dịch vụ của bạn AsSelf()

builder.RegisterType<MyService>(); 

Sau đó, bạn có thể cấu hình thiết bị đầu cuối của bạn bình thường:

host = new ServiceHost(typeof(MyService)); 
host.AddServiceEndpoint(typeof(IService1), binding, string.Empty); 
host.AddServiceEndpoint(typeof(IService2), binding, string.Empty); 

Và cuối cùng bạn cần phải gọi AddDependencyInjectionBehavior với kiểu sevicehost bản thân:

host.AddDependencyInjectionBehavior<MyService>(container); 

Đây là một nhỏ sample project (dựa trên documentation) mà chứng minh hành vi này.

+0

Cảm ơn bạn - Tôi nên nghĩ như vậy! Tôi vui vì bạn đã chứng minh tôi sai :-) –

0

Cập nhật (văn bản in đậm) dựa trên câu trả lời @ nemesv của:

Tiếp tục điều tra tiết lộ rằng với autofac một không thể đăng ký nhiều thiết bị đầu cuối trên một ServiceHost đơn nếu một đăng ký hợp đồng dịch vụ WCF . (Xem trả lời @ nemesv cho cách chính xác để làm điều đó.)

Đây là lý do tại sao:

Hoặc hình thức mở rộng phương pháp này ...

host.AddDependencyInjectionBehavior<IService1>(_container); 
host.AddDependencyInjectionBehavior(t, container); 

... giải quyết xuống để thêm ServiceBehavior (theo Alex Meyer-Gleaves initial announcement of WCF integration vào autofac) ...

host.Description.Behaviors.Add(behavior); 

Không w tài sản này Behaviors là một ví dụ của KeyedByTypeCollection<TItem>, mà chỉ có thể giữ một đối tượng của một loại nhất định. Vì hành vi được thêm vào sẽ luôn là một thể hiện của AutofacDependencyInjectionServiceBehavior, do đó, chỉ có thể thêm một điểm cuối.

QED

Cách giải quyết là sử dụng nhiều ServiceHost, mỗi một điểm cuối.

(Là một địa điểm ưa thích, tôi sẽ tò mò muốn biết tác động đến hiệu suất và khả năng mở rộng giữa hai cách tiếp cận.)

+0

Sẽ không kế thừa từ AutofacDependencyInjectionServiceBehavior và readding dụ của trợ giúp đó? –

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