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. IContextDenetleyiciyi 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 SomeClassbağlıdır Context. Hata, ama bekle, öyle değil! Sadece XBağlamdan aldığı bağımlılığa dayanır . Araçlarla Yani, her zaman bir değişiklik yapmak Contexto olabilir kırmak SomeObjectyalnızca değişse de Contexts Y. Ama evet, sen sadece değiştiğini biliyoruz Ydeğil Xbu yüzden, SomeClassgayet iyi. Ama iyi kod yazma ilgili değil sen bilir ama o senin kodun ilk kez baktığında neler yeni çalışan bilir.