Ich habe eine Schnittstelle aufgerufen IContext
. Zu diesem Zweck spielt es keine Rolle, was es tut, mit Ausnahme der folgenden:
T GetService<T>();
Diese Methode überprüft den aktuellen DI-Container der Anwendung und versucht, die Abhängigkeit aufzulösen. Ziemlich normal, denke ich.
In meiner ASP.NET MVC-Anwendung sieht mein Konstruktor folgendermaßen aus.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
So anstatt für jeden Dienst mehr Parameter im Konstruktor hinzugefügt (weil das ist wirklich ärgerlich wird und zeitraubend für die Entwickler zur Verlängerung der Anwendung) ich diese Methode bin mit Dienstleistungen zu erhalten.
Jetzt fühlt es sich falsch an . Die Art und Weise, wie ich es derzeit in meinem Kopf rechtfertige, ist jedoch folgende: Ich kann mich darüber lustig machen .
Ich kann. Es wäre nicht schwierig, sich zu verspotten IContext
, um den Controller zu testen. Ich müsste sowieso:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Aber wie gesagt, es fühlt sich falsch an. Irgendwelche Gedanken / Missbrauch willkommen.
public SomeClass(Context c)
. Dieser Code ist ziemlich klar, nicht wahr? Es heißt, es that SomeClass
kommt auf a an Context
. Ähm, aber warte, das tut es nicht! Es hängt nur von der Abhängigkeit ab, die X
es vom Kontext erhält. Das heißt, macht jedes Mal , wenn eine Änderung Context
es könnte brechen SomeObject
, auch wenn Sie nur geändert Context
s Y
. Aber ja, du weißt, dass du dich nur Y
nicht verändert hast X
, also SomeClass
ist es in Ordnung. Beim Schreiben eines guten Codes geht es jedoch nicht darum, was Sie wissen, sondern darum , was der neue Mitarbeiter weiß, wenn er sich Ihren Code zum ersten Mal ansieht.