Попробуйте отделить сообщение от поведения. Создайте класс, содержащий данные для операции, и создайте другой класс, содержащий бизнес-логику для этой операции. Например, создайте эту команду:
public class RegisterAssetCommand
{
[Required]
public int CaseNumber { get; set; }
[Required]
public User Operator { get; set; }
}
Теперь определите интерфейс для обработки бизнес-команд:
public interface ICommandHandler<TCommand>
{
void Handle(TCommand command);
}
Ваш код презентации теперь будет выглядеть так:
var command = new RegisterAssetCommand
{
CaseNumber = 1000,
Operator = GetUserFromPage(),
};
var commandHandler = WindsorContainer
.Resolve<ICommandHandler<RegisterAssetCommand>);
commandHandler.Handle(command);
Примечание: Если возможно, переместите ответственность за получение commandHandler
из класса представления и вставьте его в конструктор этого класса (повторное внедрение конструктора).
Нет, вы можете создать реализацию ICommandHandler<RegisterAssetCommand>
следующим образом:
public class RegisterAssetCommandHandler
: ICommandHandler<RegisterAssetCommand>
{
private ILawbaseAssetRepository lawbaseAssetRepository;
private IAssetChecklistKctcPartRepository assetRepository;
public RegisterAssetCommandHandler(
ILawbaseAssetRepository lawbaseAssetRepository,
IAssetChecklistKctcPartRepository assetRepository)
{
this.lawbaseAssetRepository = lawbaseAssetRepository;
this.assetRepository = assetRepository;
}
public void Handle(RegisterAssetCommand command)
{
// Optionally validate the command
// Execute the command
}
}
При желании вы могли бы даже оставить User
из RegisterAssetCommand
, введя IUserProvider
в RegisterAssetCommandHandler
. Интерфейс IUserProvider
может иметь GetUserForCurrentContext
, который может вызывать обработчик.
Надеюсь, это имеет смысл.