Утро
в кодовой базе, которую я поддерживаю, есть старый интерфейс. Давайте назовем это IFoo. Он в значительной степени устарел и заменил интерфейс INewFoo с изменением несколько недель назад, но для целей обратной совместимости я написал класс-оболочку, который реализует INewFoo и принимает IFoo в конструкторе.
Для уточнения рассмотрим следующий код.
Public Interface IFoo
Sub DoStuff()
End Interface
Public Interface INewFoo
Sub DoPrettyMuchTheSameStuff()
End Interface
Public Class FooToNewFooWrapper
Implements INewFoo
Private _foo As IFoo
Public Sub New(foo As IFoo)
_foo = foo
End Sub
Public Sub DoPrettyMuchTheSameStuff() Implements INewFoo.DoPrettyMuchTheSameStuff
_foo.DoStuff()
End Sub
End Class
Для обоих интерфейсов реализации загружаются путем сканирования нескольких сборок с помощью StructureMap.
Теперь давайте перейдем к плохим вещам. Большинство реализаций для старого интерфейса были помещены в формы по причине, которую я не могу ни понять, ни изменить. Поскольку они, как правило, отображаются и удаляются, мне приходится создавать новый экземпляр каждый раз, когда я использую ObjectFactory.GetAllInstances (Of IFoo). Это все еще не проблема, но я хотел бы зарегистрировать INewFoo-Wrapper для каждой зарегистрированной реализации IFoo, чтобы я мог просто использовать ObjectFactory.GetAllInstances (из INewFoo) и получить все реализации IFoo AND INewFoo.
Я не могу перебрать реализации IFoo и зарегистрировать обертку для каждой, потому что, насколько я вижу, вы можете просто зарегистрировать их с экземплярами.
Неправильный код ниже:
ObjectFactory.Configure(Sub(config)
config.Scan(Sub(scan)
For Each ass In assemblies
scan.Assembly(ass)
Next
scan.AddAllTypesOf(Of IFoo)()
End Sub)
End Sub)
Dim oldImplementations = ObjectFactory.GetAllInstances(Of IFoo)()
ObjectFactory.Configure(Sub(config)
For Each implementation In oldImplementations
Dim notIterated = implementation
config.For(Of INewFoo).Add(Function(x) New FooToNewFooWrapper(notIterated))
Next
End Sub)
У меня такой вопрос: возможно ли зарегистрировать оболочку для каждой реализации IFoo, которая всегда создает новый экземпляр реализации перед созданием нового экземпляра оболочки?
Ответы на C # и Vb.net одинаково приветствуются.