Sorudaki terminoloji, örnek kodla gerçekten eşleşmiyor. Bu Ambient Context
, her sınıfı bağımlılığın arayüzünü kabul etmek için kirletmeden, ancak yine de kontrolün ters çevrilmesi fikrini koruyarak, herhangi bir modüldeki herhangi bir sınıftan bir bağımlılığı olabildiğince kolay tutmak için kullanılan bir modeldir. Bu tür bağımlılıklar genellikle günlük tutma, güvenlik, oturum yönetimi, işlemler, önbellekleme, denetime adanmıştır, bu nedenle söz konusu uygulamadaki herhangi bir kesişen kaygı için. Bir eklemek nasılsa sinir bozucu ILogging
, ISecurity
, ITimeProvider
çoğu zaman değil bütün sınıflar hepsi aynı anda ihtiyaç kurucular ve, senin ihtiyacını anlamaları için.
ISession
Örneğin yaşam süresi birinden farklıysa ne olur ILogger
? Belki ISession örneği her istekte ve ILogger'da bir kez oluşturulmalıdır. Bu nedenle, tüm bu bağımlılıkların konteynerin kendisi olmayan bir nesne tarafından yönetilmesi, ömür boyu yönetimi ve yerelleştirme ve bu iş parçacığında açıklanan diğer tüm sorunlar nedeniyle doğru seçim gibi görünmemektedir.
Söz IAmbientContext
konusu soru, her yapıcıyı kirletmeme sorununu çözmemektedir. Hala yapıcı imzasında kullanmak zorundasınız, elbette, bu sefer sadece bir kez.
Bu nedenle en kolay yol, çapraz kesim bağımlılıklarıyla uğraşmak için yapıcı enjeksiyonunu veya başka bir enjeksiyon mekanizmasını kullanmak değil, statik bir çağrı kullanmaktır . Aslında bu modeli çerçevenin kendisi tarafından uygulanan oldukça sık görüyoruz. Arabirim uygulamasını döndüren statik bir özellik olan Thread.CurrentPrincipal öğesini denetleyin IPrincipal
. Ayrıca ayarlanabilir, böylece isterseniz uygulamayı değiştirebilirsiniz, böylece ona bağlı değilsiniz.
MyCore
şimdi şuna benziyor
public class MyCoreClass
{
public void BusinessFeature(string data)
{
LoggerContext.Current.Log(data);
_repository.SaveProcessedData();
SessionContext.Current.SetData(data);
...etc
}
}
Bu model ve olası uygulamalar bu makalede Mark Seemann tarafından ayrıntılı olarak açıklanmıştır . Kullandığınız IoC konteynerinin kendisine dayanan uygulamalar olabilir.
Sen kaçınmak istediğiniz AmbientContext.Current.Logger
, AmbientContext.Current.Session
yukarıda açıklandığı gibi aynı nedenlerle.
Ancak bu sorunu çözmek için başka seçenekleriniz de var: dekoratörler kullanın, kabınız bu özelliğe veya AOP'ye sahipse dinamik müdahale. Ortam Bağlamı, müşterilerinin bağımlılıklarını onun aracılığıyla gizlemesi nedeniyle son çare olmalıdır. Arayüz gerçekten taklit benim dürtü statik gibi bağımlılık kullanmak eğer hala Ortam Bağlam kullanmak DateTime.Now
veya ConfigurationManager.AppSettings
ve bu ihtiyaç oldukça sık yükseltir. Ancak sonunda yapıcı enjeksiyonu bu yaygın bağımlılıkları elde etmek için o kadar da kötü bir fikir olmayabilir.
IService
Başka bir hizmetle iletişim kurmak için kullanılır " nedir ?IService
Diğer hizmetlere belirsiz bir bağımlılığı temsil ediyorsa , bir servis bulucu gibi görünür ve mevcut olmamalıdır. Sınıfınız, tüketicilerinin onlarla ne yapacağını açıkça tanımlayan arabirimlere bağlı olmalıdır. Hiçbir sınıfın bir hizmete erişim sağlamak için bir hizmete ihtiyacı yoktur. Bir sınıfın, sınıfın ihtiyaç duyduğu belirli bir şeyi yapan bir bağımlılığa ihtiyacı vardır.