Sorunun başka bir tekrarı gibi görünüyorsa özür dilerim, ancak konuyla ilgili her makale bulduğumda çoğunlukla DI'nin ne olduğu hakkında konuşur. Bu yüzden DI alıyorum, ama herkesin girdiği bir IoC konteynerine olan ihtiyacı anlamaya çalışıyorum. Bir IoC konteynerinin amacı sadece bağımlılıkların somut uygulamasını "otomatik olarak çözmek" midir? Belki de sınıflarımın birkaç bağımlılığı yoktur ve belki de bu yüzden büyük bir anlaşma görmüyorum, ancak konteynerin faydasını doğru bir şekilde anladığımdan emin olmak istiyorum.
Genelde iş mantığımı böyle bir şeye benzeyen bir sınıfa ayırırım:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Yani sadece bir bağımlılığa sahiptir ve bazı durumlarda ikinci veya üçüncü olabilir, ancak çoğu zaman bu olmayabilir. Bunu çağıran her şey kendi repo'sunu geçebilir veya varsayılan repoyu kullanmasına izin verebilir.
Şu anda bir IoC kapsayıcısını anladığım kadarıyla, kabın yaptığı tek şey IDataRepository'yi çözmek. Ama eğer hepsi bu kadarsa, o zaman içinde bir ton değer görmüyorum çünkü operasyonel sınıflarım hiçbir bağımlılık geçmediği zaman zaten bir geri dönüş tanımlıyorlar. Bu aynı yedek repo kullanın, bu repo kayıt / fabrika / konteyner olan bir yerde değiştirebilirsiniz. Ve bu harika, ama öyle mi?
ConcreteRepository
ve (2) ek bağımlılıklar sağlayabilirsiniz ( örneğin, ConcreteRepository
bir veritabanı bağlantısı yaygındır).