Код: Выделить всё
public partial class Sdk
{
public async Task Execute1(ICommandRequest1 commandRequest)
where TOut : ICommandResponse1
{
// validation logic and other logic goes here
return await commandRequest.Execute1(this);
}
}
public interface IRequest1 { }
public interface IResponse1 { }
public interface ICommandResponse1 : IResponse1 { }
public interface ICommandRequest1 : IRequest1
where TOut : ICommandResponse1
{
Task Execute1(Sdk sdk);
}
public class DeleteOrderResponse1 : ICommandResponse1
{
public int OrderNum { get; set; }
}
// there are many request objects. this one is for deleting orders.
public class DeleteOrderRequest1 : ICommandRequest1
{
public int OrderNum { get; set; }
public async Task Execute1(Sdk sdk)
{
// logic goes here
return await Task.FromResult(new DeleteOrderResponse1()); // example response
}
}
public class TestItOut1
{
public async Task Test()
{
var sdk = new Sdk();
var request = new DeleteOrderRequest1 { OrderNum = 1 };
var response = await sdk.Execute1(request); // correct usage
// I do not want to allow this, because it bypasses all the logic in the
// sdk.Execute1() method
var response2 = request.Execute1(sdk);
}
}
Код: Выделить всё
public partial class Sdk
{
public async Task Execute2(ICommandRequest2 commandRequest)
where TOut : class, ICommandResponse2
{
// validation logic and other logic goes here
return await new CommandExecutor2().Execute2(commandRequest, this);
}
}
public interface IRequest2 { }
public interface IResponse2 { }
public interface ICommandResponse2 : IResponse2 { }
public interface ICommandExecutor2 : IRequest2
where TOut : ICommandResponse2
{
Task Execute2(ICommandRequest2 request, Sdk sdk);
}
public interface ICommandRequest2 : IRequest2
where TOut : ICommandResponse2
{
//note: no longer contains the Execute method - good
}
public class DeleteOrderResponse2 : ICommandResponse2
{
public int OrderNum { get; set; }
}
public class DeleteOrderRequest2 : ICommandRequest2
{
public int OrderNum { get; set; }
}
// there are many command executors. this one is for deleting orders.
// note: internal - so clients outside the SDK cannot access this
internal class CommandExecutor2 : ICommandRequest2, ICommandExecutor2
where TOut : class, ICommandResponse2
{
public async Task Execute2(ICommandRequest2 inputRequest, Sdk sdk)
{
// I don't like having to do a cast here
DeleteOrderRequest2 request = inputRequest as DeleteOrderRequest2;
// logic goes here
// I also don't like having to do a cast here
return (await Task.FromResult(new DeleteOrderResponse2())) as TOut; // example response
}
}
public class TestItOut2
{
public async Task Test()
{
var sdk = new Sdk();
var request = new DeleteOrderRequest2 { OrderNum = 1 };
DeleteOrderResponse2 response = await sdk.Execute2(request);
// this no longer works - good - clients will not be able to bypass the validation logic
// var response2 = request.Execute2(sdk);
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... nd-pattern
Мобильная версия