Hy, ребята,
У меня проблема, у меня есть такой интерфейс:
public interface ICommand<in TRequest, out TResponse>
where TRequest : class
where TResponse : BaseResponse
{
TResponse Execute(TRequest request);
}
тогда я два класса, который реализует этот интерфейс следующим образом:
public class ExternalAddUser : ICommand<ExternalAddUserRequest, ExternalAddUserResponse>
{
private readonly ICommand<AddUserRequest, AddUserResponse> _command;
public ExternalAddUser(ICommand<AddUserRequest, AddUserResponse> command)
{
_command = command;
}
public ExternalAddUserResponse Execute(ExternalAddUserRequest request)
{
var response = _command.Execute(Mapper.Map<AddUserRequest>(request));
return Mapper.Map<ExternalAddUserResponse>(response);
}
}
и это:
public class AddUser : ICommand<AddUserRequest, AddUserResponse>
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMessageService _messageService;
private readonly IDefaultSettings _settings;
private readonly IMessageFactory _messageFactory;
public AddUser(IUnitOfWork unitOfWork, IMessageService messageService, IDefaultSettings settings, IMessageFactory messageFactory)
{
_unitOfWork = unitOfWork;
_messageService = messageService;
_settings = settings;
_messageFactory = messageFactory;
}
public AddUserResponse Execute(AddUserRequest request)
{
// My implementation here
}
}
Интерфейс IMessageFactory - это шаблон «Фабрика / Шаблон», который создает интерфейс IMessage только с такими свойствами, как: Body, Subject, Language.
Я зарегистрировал свой класс с простым инжектором, как это:
container.Register(typeof(ICommand<,>), businessLayerAssembly);
container.Register<IDefaultSettings, DefaultSettings>(Lifestyle.Singleton);
container.Register<ISecuritySettings, SecuritySettings>(Lifestyle.Singleton);
container.RegisterConditional<IMessageFactory, ActivationMessageFactory>
(c => c.Consumer.ImplementationType == typeof(AddUser)
|| c.Consumer.ImplementationType == typeof(SendActivationEmail));
container.RegisterConditional<IMessageFactory, RecoveryMessageFactory>
(c => !c.Handled);
Теперь у меня есть другой класс, который является Decorator из ActivationMessageFactory, например:
public class ActivationMessageWithoutLinkFactory : IMessageFactory
{
private readonly IMessageFactory _messageFactory;
public ActivationMessageWithoutLinkFactory(IMessageFactory messageFactory)
{
_messageFactory = messageFactory;
}
public IMessage CreateMessage(MessageData messageData)
{
// Implementation
}
}
Мой вопрос:
Можно ли добавить ActivationMessageWithoutLinkFactory decorator в класс AddUser, когда этот класс вызывается из класса ExternalAddUser?
Пример кода запаха:
public class ExternalAddUser : ICommand<ExternalAddUserRequest, ExternalAddUserResponse>
{
public ExternalAddUserResponse Execute(ExternalAddUserRequest request)
{
ICommand<AddUserRequest, AddUserResponse> command = new AddUser(new SqlUnitOfWork(), new EmailService(),
new DefaultSettings(), new ActivationMessageWithoutLinkFactory(new ActivationMessageFactory()));
}
}
Это граф объектов, который я хочу построить:
// AddUser injected into ExternalAddUser
new ExternalAddUser(
new AddUser(
new UnitOfWork(),
new MessageService(),
new DefaultSettings(),
new ActivationMessageWithoutLinkFactory(
new ActivationMessageFactory())))
// AddUser injected into anything else
new AnythingElse(
new AddUser(
new UnitOfWork(),
new MessageService(),
new DefaultSettings(),
new ActivationMessageFactory())) // no decorator
Спасибо за ваш ответ, надеюсь, я был ясен.