Мы пытаемся интегрировать LightCore в качестве локатора сервисов по умолчанию в нашу платформу метаданных/ORM. Поэтому нам нравится использовать некоторые регистрации по умолчанию внутри Framework, которые пользователь Framework (= разработчик приложения) может каким-то образом «переопределить» своими собственными реализациями (если ему вообще нравится это делать). Как это сделать с контейнерами IoC LightCore или другими контейнерами 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() });
Привет, Марк