2015-07-29 30 views
9

Yeni ASP.NET MVC 6 şeyleri almaya çalışıyorum, ancak yeni DI sistemi ile çok zor bir zaman geçiriyorum. Kaynakları çevrimiçi bulmayı denedim, ancak bulduğum her şey onu kullanmak için sadece en mutlak minimum değeri kapsamaktadır.Çevirme ASP.NET MVC 6 DI

Daha önce Ninject kullanıyordum ve böyle çalışan birkaç tel-up vardır:

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

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

Ama şimdiye kadar ben Microsoft'un yeniye bu tür davranışları çevirmek nasıl bulmak zor bir zaman yaşıyorum DI sistemi.

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

ve: herşey hedef hizmeti için varsayılan yapıcı tamamen iş gibi görünüyor

services.AddMvc(); 

bulabilirim Bütün böyle örneklerdir. Bu yeni DI sisteminde ihtiyaç duyduğum davranışları üretmenin bir yolu var mı?

Ben

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

gördüğüm Ama bunu ben düşünüyorum, yoksa belirli bir davranış için ayrılmıştır eğer yapacak konusunda gerçekten net değilim.

+0

? Bu yeni DI sistemi, Ninject'in (ve diğer kapların) desteklediği ve yerleşik DI sisteminin [makul boyuttaki herhangi bir SOLID uygulaması için] kullanılamayacağı bir alt kümeyi destekler (https://stackoverflow.com/questions/30681477/dependency- enjeksiyon-in-the-asp-net-5-vnext/30682214 # 30682214). – Steven

+0

Doğru olduğunu düşündüğümden emin değilim, ama dürüst olmak gerekirse, mesajın çoğu kafamın üzerinden geçiyor. Temel olarak sadece kurucu enjeksiyonuna ve MAYBE mülk enjeksiyonuna bir kez ihtiyacım var. Ama biraz daha fazla araştırmaya çalışacağım – Ciel

+0

Dürüst olmak gerekirse, mülk enjeksiyonu kullandığımı sanmıyorum; Ben sadece kurucu enjeksiyonu kullanıyorum. Ancak, günlüğe kaydetme, denetim takibi, izin kontrolleri, doğrulama, işlem yönetimi, vb. Gibi kesişen kaygılar eklemeye başladığınızda, bir mimariniz varsa (https://bit.ly/1vouSrm)) [dekoratörler] (https://en.wikipedia.org/wiki/Decorator_pattern) kullanarak basit ve zarif bir şekilde kesişen endişeleri eklemenizi sağlar. Dekoratörleri vNext konteynırla olgun kaplardan biriyle yapabileceğiniz gibi uygulamak imkansızdır. – Steven

cevap

7

AddTransient yöntem bir lambda ifade kabul biri çeşitli aşırı yükleri, var

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

bu daha uygun olabilir, böylece Ninject InSingletonScope() değiştirici kullanarak gibi görünüyor Ancak:

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

Ek bilgi: Bazı pre-release documentation kullanılabilir (tabiki, tam değil ve yanlış olabilir ama yardımcı olabilir)

+0

services.AddSingleton ayrıca bir fabrika lambdasına izin verir ve Ninject kaydının eşdeğeri olacaktır. –

+0

@PaulHiles Haklı olabilirsiniz, gerçekten Ninject hakkında pek bir şey bilmiyorum. Bunu – DavidG

+0

içinde düzenlerim Üzgünüm, ama bunu denedim ve sözünü ettiğin yöntem var gibi görünmüyor. – Ciel

3

Ayrıca projenize Microsoft.Framework.DependencyInjection.Ninject ekleyerek kullanım Ninject devam edebilir ve aşağıdaki kodla yapılandırın: Neden yeni DI sistemine Ninject göç çalışıyoruz

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

Maalesef, bu yöntem artık çalışmıyor. Yakın zamanda 'ConfigureServices' yöntemini değiştirdiler ve hiçbir şey döndürmedi. – Ciel

+0

IServiceProvider'ı kaldırmaya zorlasanız bile işe yaramıyor mu? – STO

+0

Bu yüzden, MVC 5'te yaptığım gibi normal gibi Ninject'i de kaydedebilirim ve iyi çalışmalı mıyım? – Ciel

İlgili konular