Мы пытаемся интегрировать LightCore как сервисный локатор по умолчанию в нашу Metadata- / ORM-Framework.Поэтому нам нравятся некоторые Регистрации по умолчанию изнутри Framework, которые пользователь-Framework (= Разработчик приложений) может каким-то образом «отменить» своими собственными реализациями (если ему вообще нравится это делать).Как это сделать с контейнерами LightCore IoC или другими контейнерами IoC?
Что мы пытались:
var builder = new ContainerBuilder();
builder.Register<Foo>().ControlledBy<SingletonLifecycle>();
builder.Register<Foo, Foo2>().ControlledBy<SingletonLifecycle>();
var container = builder.Build();
var foo = container.Resolve<Foo>();
Мы зарегистрировали два класса в качестве контракта для Foo.С помощью приведенного выше кода мы всегда получаем первое (экземпляры Foo).Так что здесь не обойтись.Кстати: нам нравится получать экземпляр Foo2.
Мы изменили его с использования конкретных классов на интерфейсы:
var builder = new ContainerBuilder();
builder.Register<IFoo, Foo>().ControlledBy<SingletonLifecycle>();
builder.Register<IFoo, Foo2>().ControlledBy<SingletonLifecycle>();
var container = builder.Build();
var foo = container.Resolve<IFoo>();
С этим на месте мы получаем исключение разрешения в Resolve <>() сказать, что регистрация не может быть найдена.Если мы удалим второе выражение «Register ()», оно будет работать так, как мы получаем экземпляр Foo.
Мы не уверены, что пропустили некоторые общие понятия.Это работает с другими IoC так же?Каков рекомендуемый способ отмены / отмены регистрации?
Любая помощь по этой теме будет полезна - не только для LightCore.
Обновление: Я настроилнекоторые тесты для вышеуказанного сценария с использованием контейнера IoC SimpleInjector.С этим контейнером нужно указать AllowOverridingRegistration = true в конструкторе, и он будет работать как положено.Таким образом, похоже, что LightCore просто не поддерживает этот вариант использования правильно, но другие делают.
Обновление: Мы получили быстрый ответ от создателя LightCore о том, что LigtCore не поддерживает переопределение регистрациисовсем.Так что, похоже, нет никакого способа справиться с переопределением регистрации этих сценариев с помощью LightCore, поэтому мы переключились с LightCore на SimpleInjector.
Следующая конфигурация SimpleInjector соответствует нашим четырем текущим требованиям:
// Register concrete class for FooFoo
container.RegisterSingle<FooFoo>();
// Register concrete classes for Foo - Final registration should return FooFoo, not Foo
container.RegisterSingle<Foo>();
container.RegisterSingle<Foo, FooFoo>();
// Register interfaces for IFoo - Final registration should return FooFoo, not Foo
container.RegisterSingle<IFoo, Foo>();
container.RegisterSingle<IFoo, FooFoo>();
// Register list of Plugs
container.RegisterAll(new IPlug[] { new PlugA(), new PlugB() });
Cheers, Marc