2011-11-18 59 views
1

早上,结构图 - 为新接口注册旧接口的包装

在代码库中我维护着一个旧接口。我们称之为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中的答案同样受到欢迎。

回答

2

您是否尝试过实施自定义注册惯例来执行您的特定要求?海关注册公约允许非常灵活的扫描和注册

[CLSCompliant(false)] 
public class MyRegistration : IRegistrationConvention 
/// <inheritdoc /> 
    public void Process(Type type, Registry registry) 
    {   

     Type interfaceType = type.GetInterface(typeof(IFoo).Name); 
     if (interfaceType == null) 
     { 
      return; 
     } 

     registry.AddType(interfaceType, type, type.Name); 

     // Do your stuff with INewFoo 

    } 
} 

配置结构图使用扫描仪:

ObjectFactory.Configure(item => 
      { 
       item.Scan(
        x => 
        { 
         x.AssembliesFromPath("c:\wheremyassemblyis.dll"); 
         x.With(new MyRegistration()); 
        }); 
      }); 
+0

花了一点时间让我尝试一下,但还是有一些解决方法,我管理做到这一点。 – Lambda