2011-01-10 30 views
7

Tôi đang sử dụng Ninject như IoC của tôi và tôi đã viết một nhà cung cấp vai trò như sau:Ninject với MembershipProvider | RoleProvider

public class BasicRoleProvider : RoleProvider 
{ 
    private IAuthenticationService authenticationService; 

    public BasicRoleProvider(IAuthenticationService authenticationService) 
    { 
     if (authenticationService == null) throw new ArgumentNullException("authenticationService"); 
     this.authenticationService = authenticationService; 
    } 

    /* Other methods here */ 
} 

Tôi đọc mà Provider lớp được khởi tạo trước khi Ninject được để tiêm dụ. Làm thế nào để tôi đi xung quanh điều này? Tôi hiện có mã số ninject này:

Bind<RoleProvider>().To<BasicRoleProvider>().InRequestScope(); 

Từ câu trả lời này here.

If you mark your dependencies with [Inject] for your properties in your provider class, you can call kernel.Inject(MemberShip.Provider) - this will assign all dependencies to your properties.

Tôi không hiểu điều này.

+0

bản sao có thể có của [Tiêm kho lưu trữ với nhà cung cấp tư cách thành viên tùy chỉnh với Ninject] (http://stackoverflow.com/questions/5596441/inject-repository-to-custom-membership-provider-with-ninject) –

Trả lời

9

Tôi tin rằng khía cạnh này của khung ASP.NET là định cấu hình rất nhiều.

Đối với bình luận cuối cùng của bạn, những gì họ có nghĩa là thay vì dựa vào constructor injection (mà xảy ra khi các thành phần được tạo ra), bạn có thể sử dụng setter injection thay vào đó, ví dụ:

public class BasicRoleProvider : RoleProvider 
{ 
    public BasicRoleProvider() { } 

    [Inject] 
    public IMyService { get; set; } 
} 

Nó sẽ tự động tiêm một thể hiện của loại đăng ký của bạn vào tài sản. Sau đó, bạn có thể thực hiện cuộc gọi từ ứng dụng của mình:

public void Application_Start(object sender, EventArgs e) 
{ 
    var kernel = // create kernel instance. 
    kernel.Inject(Roles.Provider); 
} 

Giả sử bạn đã đăng ký nhà cung cấp vai trò trong cấu hình. Đăng ký nhà cung cấp theo cách này vẫn cho phép mô đun tuyệt vời, vì việc triển khai và áp dụng nhà cung cấp của bạn vẫn được tách rời rất nhiều.

+0

Điều này không hoạt động. Ví dụ này vẫn là null. –

+0

Tôi đã thử 'kernel.Inject (Roles.Provider)' và 'kernel.Inject (Membership.Provider)' –

+0

Hmm, tôi đã thử nghiệm điều này với 'kernel.Inject (Roles.Provider)'. Bạn có thể cập nhật câu hỏi của mình bằng mã cấu hình và mã RoleProvider nơi bạn đang cố gắng tiêm hay không. Bạn có thể kiểm tra xem bạn đã đặt RoleProvider của mình làm mặc định hay không. –

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