Структура карты - регистрация оболочки старого интерфейса для нового интерфейса - PullRequest
1 голос
/ 18 ноября 2011

Утро

в кодовой базе, которую я поддерживаю, есть старый интерфейс. Давайте назовем это 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 одинаково приветствуются.

1 Ответ

2 голосов
/ 23 ноября 2011

Вы пытались внедрить пользовательское соглашение о регистрации, чтобы выполнить ваши конкретные требования?Пользовательские соглашения о регистрации позволяют очень гибко сканировать и регистрировать

[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());
                    });
            });
...