をResolve
とRegister
として宣言することで、コンテナから抽象化を試みることができます。私はそれを数回しました。次に、コンテナIContainerを実装し、抽象的に実際のIoCコンテナをカプセル化します。私はUnityとCastle Windsorでそれを試しました。
しかし、ちょっと、私はすぐに、これは実際にはオーバーエンジニアリングであることに気付きました。私は、抽象化から抽象化しようとしたが、別の抽象化を構築しようとしていることを理解した。これはコンセプトを学ぶにはうまくいくかもしれませんが、実際のプロジェクトでは首に本当の痛みがありました。私はIoCコンテナからの抽象化に対して強く勧めます。 DI原則を正しく使用すると、とにかに容器を交換するのがかなり簡単になります。
コードはAyendeによって参照this post
//I did this mess with Service Locator
var t = ContainerService.Instance.Resolve<IMyType>();
//others could go further with same Service Locator
var t = IoCFactory.Instance.CurrentContainer.Resolve<IMyType>();
//better way, use --> IoC and DI <--
//when a program starts, or a new instance of the context created
var t = Container.Resolve<IMyType>() //this lives at the bottom of the stack
//and then you just pass IMyType to the constructor of other types
//you don't need to call Resolve again in the logical cycle
のように、overcomplicatedに見えます。
はい、Inversion of Control Containerを抽象化しました。私はあなたがそれをする必要があるならば、それはかなり明らかですあなたは本当にIoCがすべてであるものを得ることはありません。
良い点、過剰設計のようなIoCの抽象化 – pkmiec
あなたは正しく、これは要件を学習するためのものです。いったん私が自分のコンテナに入れたら、私は満足しています。しかし、ブログ上の例がyではなくxを使用しているので、あなたが学習していて別のコンテナを調達するためにアプリケーションを書き直さなければならないときは、しばらくしてからあなたに届きます。私は自分の例を持ち、特定のコンセプトを説明するためにブログがどのコンテナを使っていたとしても簡単に交換できる方法を見つけ出すことはいいと思っていました。 – Richard
私は同意する、これは過剰です。まともなIoCコンテナには、コンテナへの参照でコードを汚染する必要がないように、設定の余地が十分にあるはずです。コンテナを抽象化することが有効になる唯一の方法であれば、あなたはIoCコンテナを使用していないと言いたいでしょう。 – FMM