Adında bir arayüz var IContext
. Bunun amaçları için, aşağıdakiler dışında ne yaptığı gerçekten önemli değildir:
T GetService<T>();
Bu yöntemin yaptığı, uygulamanın geçerli DI kapsayıcısına bakmak ve bağımlılığı çözümlemeye çalışmaktır. Bence oldukça standart.
ASP.NET MVC uygulamamda kurucum şöyle görünüyor.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
Yani her hizmet için yapıcı birden fazla parametre eklemek yerine (çünkü bu uygulamayı genişleten geliştiriciler için gerçekten can sıkıcı ve zaman alıcı olacaktır) hizmet almak için bu yöntemi kullanıyorum.
Şimdi yanlış geliyor . Ancak, şu anda kafamda haklı gösterme şeklim bu - bunu alay edebilirim .
Yapabilirim. IContext
Denetleyiciyi test etmek için alay etmek zor olmaz . Yine de:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Ama dediğim gibi, yanlış geliyor. Herhangi bir düşünce / kötüye karşılama.
public SomeClass(Context c)
. Bu kod oldukça açık, değil mi? Bu, a that SomeClass
bağlıdır Context
. Hata, ama bekle, öyle değil! Sadece X
Bağlamdan aldığı bağımlılığa dayanır . Araçlarla Yani, her zaman bir değişiklik yapmak Context
o olabilir kırmak SomeObject
yalnızca değişse de Context
s Y
. Ama evet, sen sadece değiştiğini biliyoruz Y
değil X
bu yüzden, SomeClass
gayet iyi. Ama iyi kod yazma ilgili değil sen bilir ama o senin kodun ilk kez baktığında neler yeni çalışan bilir.