2010-11-08 7 views
11

Tôi mới sử dụng Ninject và tôi đang gặp sự cố khi sử dụng nó với nhà cung cấp tư cách thành viên tùy chỉnh.Sử dụng Ninject with Membership.Provider

cung cấp thành viên của tôi có một giao diện kho lưu trữ thông qua vào Dường như:.

public class CustomMembershipProvider : MembershipProvider 
{ 
    public CustomMembershipProvider(IRepository repository) 
    { 
    } 
} 

Tôi đang sử dụng mã thats một phần của mô hình tài khoản trong ứng dụng MVC như là một điểm khởi đầu.

Tuy nhiên, khi gọi số Membership.Provider tôi gặp lỗi khi nói No parameterless constructor defined for this object.

Tôi đã thiết lập các liên kết trong ninject để liên kết một IRepository với lớp Repository hoạt động như tôi đã thử nghiệm điều này trong bộ điều khiển.

Các ràng buộc chính xác trong Ninject để sử dụng cho Membership.Provider là gì?

+0

hãy xem lại câu trả lời và thưởng tốt nhất nếu bạn có thể – mare

Trả lời

9

Đây là cách nó nên được thực hiện ngày hôm nay với phiên bản mới của cả hai MVC và Ninject (phiên bản 3):

Bạn có thể truy cập đến các trường hợp DependencyResolver và Ninject đặt chính nó như là DependencyResolver hiện hành. Bằng cách đó bạn không cần hack để truy cập vào hạt nhân Ninject tĩnh. Xin lưu ý, ví dụ của tôi sử dụng kho IUserService của riêng mình cho thành viên ...

IUserService _userService = DependencyResolver.Current.GetService<IUserService>(); 
+0

Bạn làm thế nào trong WebForms thay vì MVC? – Tom

+0

Đây là giải pháp tốt hơn so với sử dụng hạt nhân trực tiếp. – kaptan

+0

Cảm ơn bạn rất nhiều! –

0

Tôi chưa từng sử dụng Ninject bao giờ hết. nhưng trong StructureMap tôi đặt sự phụ thuộc này:

expression.For<MembershipProvider>().Add(System.Web.Security.Membership.Provider); 

và hoạt động tốt.

+2

này không trả lời câu hỏi. Anh ta đang hỏi làm thế nào để tạo ra cá thể của nhà cung cấp, chứ không phải cách đưa nhà cung cấp vào một cái gì đó khác. –

5

Vì bộ sưu tập thành viên và cá thể Membership.Provider được tạo trước khi Ninject có thể khởi tạo chúng, bạn cần thực hiện kích hoạt tạo bài đăng trên đối tượng. Nếu bạn đánh dấu các phụ thuộc của mình với [Inject] đối với các thuộc tính của bạn trong lớp nhà cung cấp, bạn có thể gọi kernel.Inject(Membership.Provider) - điều này sẽ gán tất cả các phụ thuộc vào các thuộc tính của bạn.

+0

Một rút lại cho điều này là nó tạo ra một sự phụ thuộc Ninject vào nhà cung cấp. Không phải là một thỏa thuận lớn, nhưng nếu nhà cung cấp của bạn là một phần của một thư viện có nghĩa là có ít phụ thuộc bên ngoài nhất có thể, thì không có gì thú vị cả. – crush

9

Giải pháp tốt nhất tôi thấy được những điều sau đây:

private IRepository _repository; 

[Inject] 
public IRepository Repository 
{ 
    get { return _repository; } 
    set { _repository= value; } 
} 

public CustomMembershipProvider() 
{ 
    NinjectHelper.Kernel.Inject(this); 
} 

đâu NinjectHelper là một lớp helper tĩnh để có được những Kernal từ.

+4

NinjectHelper là gì? Tôi không thể tìm thấy nó. Tôi có cần tự mình tạo ra nó không? – Tomas

+0

+1 để sử dụng thuộc tính, nhưng không sử dụng "trình trợ giúp". Bạn đang làm mô hình Service Locator ở đây (loại). Bạn có thể gọi phương thức "Tiêm" trong WebActivator.PostApplicationStartMethod –