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 SomeClasskommt auf a an Context. Ähm, aber warte, das tut es nicht! Es hängt nur von der Abhängigkeit ab, die Xes vom Kontext erhält. Das heißt, macht jedes Mal , wenn eine Änderung Contextes könnte brechen SomeObject, auch wenn Sie nur geändert Contexts Y. Aber ja, du weißt, dass du dich nur Ynicht verändert hast X, also SomeClassist 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.