2015-07-29 19 views
9

Tôi đang cố gắng để có được vào ASP.NET MVC 6 công cụ mới, nhưng tôi đang có một thời gian rất khó khăn với hệ thống DI mới của họ. Tôi đã cố gắng tìm tài nguyên trực tuyến, nhưng mọi thứ tôi tìm thấy chỉ bao gồm mức tối thiểu tuyệt đối tối thiểu để sử dụng tài nguyên đó.Dịch Ninject sang ASP.NET MVC 6 DI

trước đây tôi đã sử dụng Ninject, và tôi có một vài dây-up mà làm việc như thế này:

Bind<IDocumentStore>() 
    .ToMethod(c => CreateDocumentStore()) 
    .InSingletonScope(); 

private static IDocumentStore CreateDocumentStore() { 
    // lots of initialization code, etc. 
    return documentStore; 
} 

Nhưng cho đến nay tôi đang có một thời gian khó khăn tìm hiểu làm thế nào để dịch loại hành vi để mới của Microsoft Hệ thống DI. Tất cả tôi có thể tìm thấy những ví dụ như thế này:

services.AddTransient<IEmailSender, AuthMessageSender>(); 
services.AddTransient<ISmsSender, AuthMessageSender>(); 

và:

services.AddMvc(); 

đâu tất cả mọi thứ dường như làm việc hoàn toàn vào các nhà xây dựng mặc định cho dịch vụ đích. Có cách nào để tạo ra hành vi tôi cần trong hệ thống DI mới này không?

Tôi đã nhìn thấy các

services.Configure<TOptions>(options => {}); 

Nhưng tôi không thực sự rõ ràng về việc liệu rằng sẽ làm những gì tôi đang suy nghĩ, hoặc nếu nó được dành riêng cho những hành vi cụ thể.

+0

Tại sao bạn đang cố di chuyển từ Ninject sang hệ thống DI mới? Hệ thống DI mới này chỉ hỗ trợ một tập con của những hỗ trợ Ninject (và các bộ chứa khác) và hệ thống DI tích hợp sẽ không sử dụng được cho bất kỳ ứng dụng SOLID có kích thước hợp lý nào (https://stackoverflow.com/questions/30681477/dependency- tiêm-in-the-asp-net-5-vnext/30682214 # 30682214). – Steven

+0

Tôi không nghi ngờ rằng bạn nói đúng, nhưng thành thật mà nói, hầu hết bài đăng của bạn đều nằm trên đầu tôi. Tôi về cơ bản chỉ cần tiêm constructor, và MAYBE bất động sản tiêm một lần. Nhưng tôi sẽ cố gắng nghiên cứu nó nhiều hơn một chút – Ciel

+0

Vâng, thành thật mà nói, tôi không nghĩ rằng tôi đã từng sử dụng tính năng tiêm tài sản; Tôi chỉ sử dụng tiêm constructor. Nhưng một khi bạn bắt đầu thêm các mối quan tâm xuyên suốt như đăng nhập, kiểm tra dấu vết, kiểm tra quyền, xác thực, quản lý giao dịch, v.v., bạn sẽ hài lòng nếu bạn có [kiến trúc] (https://bit.ly/1vouSrm)) cho phép bạn thêm các mối quan tâm xuyên suốt một cách đơn giản và thanh lịch bằng cách sử dụng [decorator] (https://en.wikipedia.org/wiki/Decorator_pattern). Nó chỉ đơn giản là không thể áp dụng trang trí với container vNext như bạn có thể làm với một trong các thùng chứa trưởng thành. – Steven

Trả lời

7

Phương pháp AddTransient có quá tải khác nhau, một trong số đó chấp nhận một biểu thức lambda:

services.AddTransient<IDocumentStore>(s => CreateDocumentStore()); 

Tuy nhiên có vẻ như bạn đang sử dụng Ninject InSingletonScope() modifier vì vậy đây có thể thích hợp hơn:

services.AddSingleton<IEmailSender>(s => CreateDocumentStore()); 

Lưu ý bổ sung: Có một số pre-release documentation có sẵn (tất nhiên, nó không đầy đủ và có thể không chính xác nhưng có thể hữu ích)

+0

services.AddSingleton cũng cho phép một nhà máy lambda và sẽ tương đương với đăng ký Ninject. –

+0

@PaulHiles Bạn có thể đúng, tôi thực sự không biết nhiều về Ninject. Tôi sẽ chỉnh sửa điều đó. – DavidG

+0

Tôi xin lỗi, nhưng tôi đã thử cách này và phương pháp bạn đang nói dường như không tồn tại. – Ciel

3

Ngoài ra, bạn có thể tiếp tục sử dụng Ninject bằng cách thêm Microsoft.Framework.DependencyInjection.Ninject vào dự án của bạn và sau đó định cấu hình nó bằng mã sau:

public IServiceProvider ConfigureServices(Microsoft.Framework.DependencyInjection.IServiceCollection services) 
{ 
    var kernel = CreateMyKernel(); 
    kernel.Populate(services); // Wire up configured services and Ninject kernel with Microsoft tool 
    return kernel.Get<IServiceProvider>(); 
} 
+0

Thật không may, phương pháp này không hoạt động nữa. Họ đã thay đổi phương thức 'ConfigureServices' gần đây và nó không trả về bất cứ thứ gì. – Ciel

+0

Nó không hoạt động ngay cả khi bạn cố gắng loại bỏ IServiceProvider? – STO

+0

Vì vậy, tôi chỉ có thể đăng ký Ninject như bình thường, giống như tôi đã làm trong MVC 5, và nó sẽ làm việc tốt? – Ciel

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