在代码库中我维护着一个旧接口。我们称之为IFoo。它几乎变得过时了,几周前用Interface 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(IFoo)。这仍然没有问题,但我想为IFoo的每个注册实现注册一个INewFoo-Wrapper,这样我就可以使用ObjectFactory.GetAllInstances(INewFoo)并获得IFoo和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中的答案同样受到欢迎。
花了一点时间让我尝试一下,但还是有一些解决方法,我管理做到这一点。 – Lambda