Я использую 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>]]
Кто-нибудь знает, как я могу решить эту проблему ?
Я использовал свой код, но это вызывает мой 'ICommandHandler' не украшает любой декоратор. Как я могу найти, что такое 'instance' во время выполнения? – Masoud
Привет @Masoud, я обновил код - повторите попытку? – qujck
Спасибо, он работает правильно сейчас :) – Masoud