Я оставлю этот ответ здесь для дальнейшего использования, но мне нравится мой другой ответ лучше.
Оригинальный ответ довольно длинный и очень специфичен для примера в вопросе.
Я не думаю, что есть конфигурация, эквивалентная GetObjectsOfType(...)
.
Однако не так ли легко избавиться от зависимости Spring.net?
Дайте мне посмотреть, правильно ли я понимаю:
// sharedLib contains ICustomInterfaceThatDoesSomething
// by "-->" I mean "depends on"
webApp --> Spring.Core, Spring.Web
webApp --> sharedLib
sharedLib --> Spring.Core // only to call GetObjectsOfType(...) on Spring container
Мы хотим избавиться от последней зависимости, потому что мы хотим иметь возможность использовать sharedLib
в сочетании с другим DI-контейнером. В sharedLib
у нас есть класс, который должен сигнализировать всем реализациям ICustomInterfaceThatDoesSomething
, чтобы что-то делать.
Для этого я бы создал:
MySomethingManager
{
public MySomethingManager() {}
public MySomethingManager(IMySomethingDoerProvider prov)
{ // init SomethingDoers }
IList<ICustomInterfaceThatDoesSomething> SomethingDoers { get; set; }
void SignalAllToDoSomething()
{
foreach (var doer in Provider.SomethingDoers )
doer.DoSomething();
}
}
IMySomethingDoerProvider
{
IList<ICustomInterfaceThatDoesSomething> GetAll();
}
MySomethingManager
раньше содержал зависимость Spring, но теперь это Spring Free.
Теперь у меня есть два варианта при подключении sharedLib
относительно MySomethingManager
:
- с использованием инъекции свойства
MySomethingManager.SomethingDoers
с List<ICustomInterfaceThatDoesSomething>
- с использованием инжектора конструктора с реализацией
IMySomethingDoerProvider
И то, и другое можно сделать с помощью Spring и многих других DI-контейнеров. Вы можете использовать первый подход
если вы не возражаете перечислить все ICustomInterfaceThatDoesSomething
в конфигурации.
Если вам нужен волшебный код GetObjectsOfType(...)
, вы можете использовать функции вашего контейнера DI для создания IMySomethingDoerProvider
.
При использовании Spring для второго подхода потребуется создать:
MySomethingDoerSpringProvider: IMySomethingDoerProvider
{
IList<ICustomInterfaceThatDoesSomething> GetAll()
{
// use Spring.Context.Support.ContextRegistry.GetContext()
// .GetObjectsOfType(typeof (ICustomInterfaceThatDoesSomething));
}
}
Что вы можете поместить в проект, который зависит от sharedLib
. Поскольку ваш webApp
уже зависит от Spring.Core, вы можете поместить туда MyProvider
, чтобы быстро начать работу.
Примечания
Если DoSomething
вызывается один раз за экземпляр, вы можете вместо этого указать метод инициализации.