コンテナー (非常にスマートな工場) とアドバイス (煩雑な詳細をすべて処理するため) について考えるかもしれません。
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.
これは、コードで次のように表示される場合があります。
//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
}
インターセプター クラスの作成は 1 回だけ行われます。各インターセプターとサービス クラスの登録も 1 回だけ行われます。コンテナー (非常にスマートな工場) のセットアップは確かに複雑です。
ただし、コード内でサービス オブジェクトを使用する必要があり、その使用を例外処理やロギングなどの複雑で厄介なインフラストラクチャの詳細に埋め込む必要がある場所はすべて、非常にクリーンで非常に単純になりました。は 1 つしかありませんCreateContainer
が、何百もの があるGottaGoDoSomething
ため、少し複雑ですが、非常に簡単です。
(注: このコード例では、Autofac コンテナー フレームワークと Castle インターセプター フレームワークを使用しています。これは依存性注入パターンではなく、サービス ロケーション パターンの例であることは承知していますが、要点はインターセプターを説明し、インターセプターを登録することでした。コンテナー (依存性注入を説明するためのものではありません)。