Sen Ayrıca doğrudan hizmet enjekte unutmayın
IServiceProvider
kullanılmalıdır jenerik
GetService<T>();
uzatma yöntemine erişmek için Microsoft.Extensions.DependencyInjection ad alanında getirmek zorunda ASP.NET 5. denetleyicileri içine bakın. Aşağıdaki örneğe bakın.
public interface ISomeService
{
string ServiceValue { get; set; }
}
public class ServiceImplementation
{
public ServiceImplementation()
{
ServiceValue = "Injected from Startup";
}
public string ServiceValue { get; set; }
}
Startup.cs
public void ConfigureService(IServiceCollection services)
{
...
services.AddSingleton<ISomeService, ServiceImplementation>();
}
HomeController
using Microsoft.Extensions.DependencyInjection;
...
public IServiceProvider Provider { get; set; }
public ISomeService InjectedService { get; set; }
public HomeController(IServiceProvider provider, ISomeService injectedService)
{
Provider = provider;
InjectedService = Provider.GetService<ISomeService>();
}
Ya yaklaşım hizmetine erişmek için kullanılabilir. Ek hizmet için her zaman bir tane verilir. İlk nesne oluşturulmasından siz sorumlusunuz.
AddSingleton<IService, Service>()
Tek bir örnek oluşturulur ve bir singleton gibi davranır.
AddTransient<IService, Service>()
Her enjekte edildiğinde yeni bir örnek oluşturulur.
AddScoped<IService, Service>()
Geçerli HTTP İsteği kapsamında tek bir örnek oluşturulur. Mevcut kapsam bağlamında Singleton'a eşdeğerdir.
Güncelleme 13 Ekim 2016
Bkz:
public class Entity
{
private readonly IDataContext dbContext;
// The DI will auto inject this for you
public class Entity(IDataContext dbContext)
{
this.dbContext = dbContext;
}
public void DoSomething()
{
// dbContext is already populated for you
var something = dbContext.Somethings.First();
}
}
Ancak Entity
olurdu: aspnet GitHub - ServiceCollectionServiceExtensions.cs
sayesinde cevap için, ama eğer birçok varlığım varsa yeniden yazmam gerekiyor te kurucular ve yöntem argümanlar içinde enjeksiyon çirkin görünüyor kullanarak Activator.CreateInstance, kullanarak olamaz u YAGNI aşağıdaki bana iyi paterni söyleyebilir? – Sam
Entity Framework'ü kullanmaya çalışıyor musunuz? Enjeksiyon, yöntemlerde değil, yapıcılarda kullanılır. Bu bağlamda YAGNI ile ne demek istediğinden emin değilim. – Anton
Evet, Entity Framework'ü kullanıyorum, ancak şu durumda bakın: Örneğin, Katalog - ve Katalog'un var özelliği - Url, eski MVC'de sadece httpcontext sarmalayıcı oluşturabilir ve url helper özelliğini kullanarak , Yeni MVC'de Bunu yapamıyorum ve yöntemde IUrlHelper (özellik yolunda yeni yöntem sarıcı ekleyerek) DRY için 'u ekleyin, ancak bu hala çok garip – Sam