Вы, конечно, можете попытаться сделать абстракцию из контейнера, объявив IContainer
, скажем, Resolve
и Register
.Я делал это пару раз.Затем вы могли бы реализовать Container: IContainer и инкапсулировать фактический контейнер IoC с вашей абстракцией.Я попробовал это с Unity и Castle Windsor.
Но, эй, скоро я понял, что это действительно чрезмерная инженерия.Затем я понял, что пытался абстрагироваться от абстракции, но построить еще одну абстракцию.Это может быть хорошо, чтобы изучить концепцию, но это была настоящая боль в шее в реальном проекте.Я очень рекомендую против абстракции от контейнера IoC.Если вы правильно используете принцип DI, то все равно будет довольно легко изменить ваш контейнер.
Код выглядит слишком сложным, как
//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
См. этот пост от Ayende.
Да, они абстрагировали Инверсию Контейнера Контроля.Я думаю, что если вам нужно это сделать, то совершенно очевидно, что вы не совсем понимаете, что такое IoC.