Sie könnten über Container denken (sehr intelligente Fabriken) und Beratung (behandeln alle unordentlich Details).
Dear Mr. Container Sir,
Whenever I request from you an instance object of the interface ISomething,
please construct for me an instance of the concrete class SomethingImpl;
in addition, please see to it (however you do it) that, whenever I call a
method on this instance, it is wrapped within a complicated and messy try-
catch-finally which logs exceptions and mark calls as completed. That way,
all I have to do is write the business logic that goes into the SomethingImpl
and I don't have to worry about all the messy infrastuctural details.
Sincerely,
Mr. Agile.
Man könnte dies sehen, im Code, wie:
//a class that knows how to take care of the messy infrastructure details
public class MyMessyInterceptor : IInterceptor {
public void Intercept(IInvocation invocation) {
//handle the messy details of continuing with the method-invocation,
//but within a try-catch-finally that includes exception handling and
//call logging.
}
}
//a function that will configure a container (very smart factory)
public IContainer CreateContainer() {
var builder = new ContainerBuilder();
//tell the container-builder about the interceptor
builder
.Register(c => new MyMessyInterceptor())
.Named("keep-my-code-clean")
;
//tell the container what to do when you ask it for a ISomething
builder
.Register<SomethingImpl>()
.As<ISomething>()
.InterceptedBy("keep-my-code-clean")
;
return builder.BuildContainer();
}
//some function out there in your code somewhere that needs to make a
//service call; there's hundreds of functions out there just like this
//in your code, and they all just got much simpler
public object GottaGoDoSomething() {
//find the container
var container = GetTheSingletonContainerObject();
//ask for an instance of ISomething - it knows to provide a
//SomethingImpl wrapped in an interceptor that takes care of all
//the logging and exception handling
var something = container.resolve<ISomething>();
//call the big method
return something.DoSomething();
//magically (not really), the exception handling and logging are
//already taken care of
}
mit der Interceptor-Klasse nur einmal Coming up passiert. Die Registrierung jeder Interceptor- und Serviceklasse erfolgt ebenfalls nur einmal.Das Einrichten des Containers (sehr Smart Factory) ist sicherlich kompliziert.
Allerdings muss jeder Ort in Ihrem Code, der das Serviceobjekt verwenden muss und diesen in komplizierte und unordentliche Infrastrukturdetails wie Ausnahmebehandlung und Protokollierung einbetten muss, einfach sehr sauber und sehr unkompliziert werden. Es gibt nur eine CreateContainer
, aber es gibt Hunderte von GottaGoDoSomething
s, so dass eine ganze Menge von einfachen auf Kosten von ein wenig kompliziert ist.
(Hinweise: Das Codebeispiel verwendet das Autofac-Containerframework und das Castle-Interceptorframework. Ich weiß, dass dies ein Beispiel für das Dienstortmuster ist, nicht das Abhängigkeitsinjektionsmuster, aber der Punkt war, Interzeptoren zu veranschaulichen und sie mit einem Container registrieren, um die Abhängigkeitsinjektion nicht darzustellen.
Sie haben bereits die ideale Format. –