2011-01-20 33 views
6

Tôi có một số hành vi dịch vụ cho các dịch vụ WCF mà tôi chỉ muốn đăng ký; không có cấu hình. I figured tôi có thể bỏ qua việc tạo ra một BehaviorExtensionElement hậu duệ mỗi thời gian bằng cách sử dụng Generics:Có phải một Hành vi chung có thể xảy ra không?

public class SimpleBehaviorExtensionElement<TBehavior> : BehaviorExtensionElement 
    where TBehavior: new() 
{ 
    protected override object CreateBehavior() 
    { 
     return new TBehavior(); 
    } 

    public override Type BehaviorType 
    { 
     get { return typeof(TBehavior); } 
    } 
} 

Và trong Web.config:

<behaviorExtensions> 
    <add name="myBehavior2" 
    type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, 
     WcfService1]], WcfService1"/> 
</behaviorExtensions> 

WcfService1.MyBehavior tồn tại, thực hiện IServiceBehavior, và đã được thử nghiệm.

Nhưng khi tôi tham khảo < myBehavior2/> trong phần hành vi của các tập tin cấu hình, tôi nhận được:

xảy ra lỗi khi tạo phần handler cấu hình cho System.ServiceModel/hành vi: yếu tố mở rộng 'myBehavior2' không thể thêm vào phần tử này. Xác minh rằng tiện ích được đăng ký trong bộ sưu tập mở rộng tại system.serviceModel/extensions/behaviorExtensions. Tên thông số: phần tử

Mọi thứ đều hoạt động nếu tôi tạo hành vi không chung chung.Giải trí hậu cần, mà tôi có thể làm. Nhưng bây giờ nó lỗi tôi. ;)

Trả lời

2

Thật không may này là không thể với các tập tin cấu hình, ít nhất là không theo một cách đáng tin cậy.

Lý do là nếu bạn có một lớp generic class A<T> và một tham số lớp class B khuôn khổ sẽ không tạo ra một lớp A<B> cho đến khi bạn khai báo một loại A<B> bằng cách sử dụng nó. Tên trong định dạng A`1 [[B, Assm]] chỉ là tên được tạo ra trong thời gian chạy - nó có nghĩa là "A" chung có 1 tham số được tạo với các kiểu sau. Nó không phải là một gợi ý cho một nhà máy kiểu - đó là những gì bạn cần cho những gì bạn đang làm. Vì vậy, bạn có thể có thể có được điều này để làm việc nếu bạn may mắn và A<B> xảy ra đã được công bố, nhưng tôi sẽ không dựa vào nó.

Đây là, tôi tin rằng, được cố định trong tuần tự hóa hợp đồng dữ liệu được sử dụng bởi các phần sau của khuôn khổ, nhưng cấu hình cũ.Nếu bạn nhìn vào XAML có khả năng sử dụng một đối số kiểu với một kiểu:

<scg3:Dictionary x:TypeArguments="x:String, x:Object"> 

Lưu ý đây là một hướng dẫn rõ ràng để một nhà máy loại - điều mà các phân tích cú pháp cấu hình không không có.

Vì vậy, thật đáng buồn này để lại cho bạn với các chi phí của khai báo một kiểu dữ liệu cụ cho mỗi lần gia hạn - nhưng nó không phải là rất nhiều công việc:

public class MyBehaviorExtensionElement : 
     SimpleBehaviorExtensionElement<MyBehavior> {} 

Và ở phía bên cộng với nó làm cho tập tin cấu hình của bạn dễ đọc hơn.

<behaviorExtensions> 
    <add name="myBehavior" 
    type="BehaviorTest.MyBehaviorExtensionElement, ServiceLibrary"/>  
</behaviorExtensions> 
0

Có, điều đó là có thể.

Tôi đoán lý do ngoại lệ bị ném là vì các yếu tố hành vi được thêm WCF extensions without including the assembly version.

Khi xác định các loại hành vi, Version, Văn hóaPublicKeyToken thuộc tính PHẢI được bổ sung là tốt. Cũng xin lưu ý rằng có PHẢI chính xác là một dấu cách sau mỗi dấu phẩy (dấu phẩy) và các thuộc tính PHẢI xuất hiện theo thứ tự đã đề cập ở trên.

Vì vậy, trong ví dụ của bạn, sau nên làm việc:

<behaviorExtensions> 
    <add name="myBehavior2" 
     type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, WcfService1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], WcfService1" /> 
</behaviorExtensions> 
+0

Đó không phải là trường hợp. Tôi có các phần tử mở rộng hành vi làm việc chỉ định loại không có phiên bản. – TrueWill

+0

@TrueWill: Tôi nghi ngờ rằng bất kỳ yếu tố làm việc nào thực sự là một yếu tố chung. –

+0

bạn đã thử điều này và thành công đã nhận nó để làm việc với một phần mở rộng chung? – TrueWill

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