Aynı arabirimden türetilen hizmetlerim var.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Tipik olarak, gibi diğer IoC kapları, Unity
somut uygulamaları Key
onları ayıran bazı kişiler tarafından kaydetmenize izin verir .
ASP.NET Core'da, bu hizmetleri nasıl kaydedebilirim ve bazı anahtarlara dayanarak çalışma zamanında nasıl çözebilirim?
Genellikle somut uygulamayı ayırt etmek için kullanılacak Add
bir key
veya name
parametre alan herhangi bir Hizmet yöntemi görmüyorum .
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
Fabrika kalıbı burada tek seçenek mi?
Update1
ben makalesinde rağmen gitti burada biz birden beton uygulamaları varken hizmet örneklerini almak için fabrika deseni nasıl kullanılacağını gösterir. Ancak, hala tam bir çözüm değildir. _serviceProvider.GetService()
Yöntemi çağırdığımda, yapıcıya veri enjekte edemiyorum.
Örneğin şunu düşünün:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
_serviceProvider.GetService()
Uygun bağlantı dizesini nasıl enjekte edebilirim ? Unity'de veya başka bir IoC kütüphanesinde, bunu tür kaydında yapabiliriz. Ancak, tüm ayarları enjekte etmemi gerektiren IOption'u kullanabilirim . Hizmete belirli bir bağlantı dizesi enjekte edemiyorum.
Ayrıca, diğer kapları (Unity dahil) kullanmaktan kaçınmaya çalıştığımı unutmayın çünkü o zaman başka her şeyi (örneğin, Denetleyiciler) yeni kapsayıcıya da kaydetmeliyim.
Ayrıca, hizmet örnekleri oluşturmak için fabrika modelini kullanmak, istemcinin burada ayrıntıları verdiği bağımlılık sayısını artırdığından DIP'ye aykırıdır .
ASP.NET Core varsayılan DI iki şey eksik düşünüyorum:
- Anahtar kullanarak örnekleri kaydetme yeteneği
- Kayıt sırasında yapıcılara statik veri enjekte etme yeteneği
Update1
kurucular şeyler enjekte gibi farklı bir soruya taşınacak inşa itiraz hangi çalışma dışarı çok farklıdır