2009-07-24 39 views
10

Theo dõi về việc sử dụng dependency injection cho WCF services, là có cách nào sử dụng DI cho WCF Validators, vì vậy mà người ta có thể làm điều này:Làm thế nào để tiêm một đối tượng vào một lớp WCF validator

public class DIValidator : UserNamePasswordValidator 
{ 
    private readonly IService service; 

    [Inject] 
    public DIValidator(IService service) 
    { 
     this.service = service; 
    } 

    public override void Validate(string userName, string password) 
    { 
     service.Login(userName, password); 
    } 
} 

EDIT - Tôi đã cố gắng áp dụng lời khuyên của Dzmitry cho phần mở rộng hành vi tùy chỉnh của tôi, vì trình duyệt tính hợp lệ của tôi được định nghĩa trong app.config. Đáng buồn là tôi nhận được một MethodMissingException, kể từ WCF muốn validator của tôi để có một constructor mặc định:

System.MissingMethodException: No default constructor has been defined for this object.

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, BooleannoCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)

Đây là lớp hành vi của tôi:

public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior 
    { 
     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      serviceHostBase.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = DISupport.Kernel.Get<IService>(); 
     } 
    } 
+0

"Trình xác thực WCF" là gì? –

+0

Tôi không biết phải gọi nó là gì nữa. Nếu bạn muốn tôi được cụ thể một "trình xác nhận wcf" trong trường hợp này sẽ là một triển khai tùy chỉnh của một UserNamePasswordValidator. –

+0

John. Tại sao bạn lại tự mãn? Tôi cũng có thể như thế nếu tôi có hơn 56.000 điểm đại diện, nhưng bạn sẽ trở nên vô cùng. Những ý kiến ​​này không chỉ từ bài viết này, mà từ những câu trả lời và chủ đề khác mà bạn đã tham gia ở đâu, trong một số trường hợp, bạn trở nên tàn bạo và có ý nghĩa. – SideFX

Trả lời

1

Tôi biết điều này không phải là các giải pháp bạn đang tìm kiếm, nhưng tôi sẽ tạo ra một constructor mặc định mà sẽ nhận được IService từ container IoC của bạn (dịch vụ định vị thay vì DI). Không phải là cách tốt nhất để làm điều này, nhưng đơn giản nhất tôi có thể nghĩ đến.

Chỉnh sửa: tất nhiên bạn có thể rời khỏi hàm tạo cho phép bạn chèn phụ thuộc, nếu bạn cần giả lập IService để thử nghiệm hoặc bất kỳ purpouse khác.

+0

Tôi có xu hướng làm điều này khi không còn tùy chọn nào khác - hãy để nguyên hàm tạo thông thường, và cung cấp một hàm tạo tham số thứ hai gọi hàm ban đầu bằng cách sử dụng đối số ServiceLocator'ed – AlexFoxGill

3

Trình xác thực tùy chỉnh chung được gán theo chương trình (cũng có khả năng làm như vậy từ tệp cấu hình) như thế này và nó được thực hiện ngay trước khi máy chủ dịch vụ được mở và về cơ bản đây cũng là lúc bạn tạo cá thể chứa DI sẽ được sử dụng thêm cho các trường hợp dịch vụ thông qua nhà cung cấp dụ:

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator(); 

Bạn cũng có thể sử dụng DI container để tạo trình xác thực tùy chỉnh của mình.

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>(); 
+0

Cool, có cách nào gán kiểu xác nhận hợp lệ trong app.config và khởi tạo kiểu trình xác nhận hợp lệ từ một cá thể IServiceBehaviour? Tôi đã cố gắng thiết lập CustomUserNamePasswordValidator từ lớp hành vi tùy chỉnh của tôi nhưng tôi nhận được một ngoại lệ thời gian chạy khi tôi khởi động dịch vụ WCF của tôi. –

+0

Bạn có thể vui lòng cung cấp cho tôi mẫu mã và chi tiết ngoại lệ và tôi sẽ cố gắng giúp bạn. –

+0

Bây giờ tôi đã chỉnh sửa câu hỏi của mình. –

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