2014-09-04 16 views
12

Tôi đang theo dõi để sử dụng Ninject làm vùng chứa IoC nhưng không thể hiểu cách tạo một thể hiện của một lớp có nhiều hơn 1 tham số trong hàm tạo. Về cơ bản tôi có một giao diện dịch vụ để xác thực trong một thư viện PCL và thực hiện nó trong một dự án WP8 tiếp nhận trong constructor phím cosumer, bí mật và baseAddress:Constructor với nhiều đối số với Ninject

//On PCL project 
public interface IAuthorizationService { 
bool Authenticate(); 
} 

//On WP8 Project 
pubilc class MyAuthenticator : IAuthorizationService { 
public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { ... } 
public bool Authenticate() { ... } 
} 

Bây giờ tôi cần phải cấu hình Ninject mô-đun để tôi có thể có được một thể hiện của IAuthorizationService. Nếu lớp học của tôi không có nhà xây dựng tôi sẽ làm:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>(); 
} 
} 

Nếu nó đã giá trị cố định cho các nhà xây dựng tôi sẽ làm:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument(*/* fixed argument here*/*); 
} 
} 

Và để có được một thể hiện Module.Get<IAuthorizationService>()

Nhưng những gì nếu các tham số constructor không thể được giải quyết tại thời gian biên dịch? Làm thế nào để vượt qua các paramenters? Mã ràng buộc phải như thế nào?

Đã chỉnh sửa claryfy câu hỏi.

+0

Tại sao bạn nên downvote? nên có ít nhất nhận xét vì vậy tôi có thể thay đổi câu hỏi ... –

+0

nó có lẽ bởi vì họ cảm thấy rằng câu hỏi này được dễ dàng trả lời bằng cách nhìn vào các tài liệu: https://github.com/ninject/ninject/wiki/Dependency-Injection- Với-Ninject – BatteryBackupUnit

+0

Không, nó không phải là! Nếu bạn nhìn vào các tài liệu, tất cả các tham số của hàm tạo là "có thể tiêm" được. Constructor của tôi có các tham số chuỗi. –

Trả lời

10

Rất dễ dàng. Không có vấn đề bao nhiêu đối số nhà xây dựng, các ràng buộc vẫn như cũ:

Bind<IAuthorizationService>().To<MyAuthenticator>(); 

Hãy nói rằng MyAuthenticator đã có một nhà xây dựng với một tham số có kiểu IFoo. Tất cả những gì bạn cần làm là cho biết cách xử lý/tạo một IFoo. Một lần nữa, rất đơn giản:

Bind<IFoo>().To<Foo>(); 

Bạn không cần WithConstructorArgument bao giờ hết, trừ trong trường hợp bạn muốn ghi đè lên hành vi mặc định của Ninject. Giả sử MyAuthenticator có thông số loại IFoo cùng với thông số khác string seed mà bạn muốn định cấu hình cụ thể. Tất cả những gì bạn cần là:

Bind<IFoo>().To<Foo>(); 
Bind<IAuthorizationService>().To<MyAuthenticator>() 
    .WithConstructorArgument("seed", "initialSeedValue"); 

không cần chỉ định giá trị của thông số IFoo!

+1

Đó là vấn đề, constructor của tôi có tham số chuỗi và tôi không biết giá trị của họ trên thời gian Bind. –

+0

Bạn lấy giá trị của thông số chuỗi từ đâu? Tôi nghĩ bạn có thể cần một nhà máy. Tại sao bạn không chuyển các tham số chuỗi này làm đối số cho phương thức 'Authenticate()'? – BatteryBackupUnit

+0

2 trong số đó là từ các tệp cấu hình, vì vậy tôi đã thông qua với phương thức ´WithConstructorArgument() ´. Một tùy chọn khác phụ thuộc vào đầu vào của người dùng. –

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