2014-09-13 5 views
0

Я использую Structuremap 3 и есть 3 модулей в моем WinForm проекта (каждый модуль представляет собой проект библиотеки классов):Украшать интерфейс с использованием декоратора StructureMap 3 в модульном приложении

Основной модуль содержит:

public class ICommandHandler<T> 
    { 
    } 

[Обновлено]

public abstract class UnitOfWorkCommitCommandHandlerDecorator<TUnitOfWork, TCommand> : ICommandHandler<TCommand> 
    where TUnitOfWork : IUnitOfWork 
    { 
    } 

Module1 содержит:

public interface IModule1UOW: IUnitOfWork 
    { 
    } 

    public class Module1UOW:IModule1UOW 
    { 
    } 

    public class Module1UOWDecorator<TCommand> :UnitOfWorkCommitCommandHandlerDecorator<IModule1UOW,TCommand> 
    { 
     public Module1UOWDecorator(ICommandHandler<TCommand> decorated, IModule1UOW uow) 
     { 
     ... 
     } 
    } 

    public Command1 
    { 
    } 

Module2 содержит:

public interface IModule2UOW: IUnitOfWork 
    { 
    } 

    public class Module2UOW:IModule2UOW 
    { 
    } 

    public class Module2UOWDecorator<TCommand> :UnitOfWorkCommitCommandHandlerDecorator<IModule2UOW,TCommand> 
     public Module2UOWDecorator(ICommandHandler<TCommand> decorated, IModule2UOW uow) 
     { 
     ... 
     } 
    } 

    public Command2 
    { 
    } 

и определены следующие классы для настройки регистрации каждого модуля:

public class Module1Config 
{ 
    public static void Config() 
    { 
     ObjectFactory.Configure(x => 
     { 
      x.Scan(s => 
      { 
       s.AssemblyContainingType(typeof(Command1)); 
       s.WithDefaultConventions(); 
       x.For(typeof(IModule1UOW)) 
        .Use(typeof(Module1UOW)) 
        .SetLifecycleTo((Lifecycles.Singleton)); 
       x.For(typeof(ICommandHandler<>)) 
        .DecorateAllWith(typeof(Module1UOWDecorator<>)); 
      }); 
     }); 
    } 
} 
public class Module2Config 
{ 
    public static void Config() 
    { 
     ObjectFactory.Configure(x => 
     { 
      x.Scan(s => 
      { 
       s.AssemblyContainingType(typeof(Command2)); 
       s.WithDefaultConventions(); 
       x.For(typeof(IModule2UOW)) 
        .Use(typeof(Module2UOW)) 
        .SetLifecycleTo((Lifecycles.Singleton)); 
       x.For(typeof(ICommandHandler<>)) 
        .DecorateAllWith(typeof(Module2UOWDecorator<>)); 
      }); 
     }); 
    } 
} 

В начальной точке моего приложения (I используя WinForms, поэтому в program.cs) Я вызываю Module1Confog.Config() a d затем Module2Config.Config().

Когда я получаю ICommandHandler<Command2> экземпляр из ObjectFactory я ожидал ICommandHandler<Command2> объект, украшенный Module2UOWDecorator но я получаю ICommandHandler<Command2> объект, украшенный Module2UOWDecorator и снова украшенную Module1UOWDecorator.

В другом слове я ожидаю:

Module2UOWDecorator[ICommandHandler<Command2>]

, но я получаю

Module1UOWDecorator[Module2UOWDecorator[ICommandHandler<Command2>]]

Кто-нибудь знает, как я могу решить эту проблему ?

ответ

2

Контейнер будет обрабатывать конфигурации, определенные в различных модулях, и объединить их в единую рабочую конфигурацию. Контейнер не будет обрабатывать различные модули как отдельные конфигурации.

Но вы все равно можете делать то, что хотите, поскольку метод DecorateAllWith имеет необязательный параметр filter для принятия решения о том, что будет, и не будет, оформлено.

Основываясь на приведенном выше примере вы могли бы попробовать что-то вроде этого:

x.For(typeof(ICommandHandler<>)) 
    .DecorateAllWith(
     typeof(Module2UOWDecorator<>), 
     instance => instance.ReturnedType.Assembly == typeof(Class2).Assembly)); 
+0

Я использовал свой код, но это вызывает мой 'ICommandHandler' не украшает любой декоратор. Как я могу найти, что такое 'instance' во время выполнения? – Masoud

+0

Привет @Masoud, я обновил код - повторите попытку? – qujck

+1

Спасибо, он работает правильно сейчас :) – Masoud

Смежные вопросы