如何在接口实现代码C#之前执行一个默认方法?
How to execute a default method before the interface implementation code C#?
我有一个只实现一种方法的接口:
public interface IHandler<T> where T : Comand
{
Task<IResultComand> HandlerAsync(T comand);
}
我在 类 中使用它如下:
public class ProductHandler : IHandler<NewProductComand>,
IHandler<EditProductComand>,
IHandler<DeleteProductComand>
public async Task<IResultComand> HandlerAsync(NewProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Create new product
return result;
}
public async Task<IResultComand> HandlerAsync(EditProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Edit product
return result;
}
public async Task<IResultComand> HandlerAsync(DeleteProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Delete product
return result;
}
而我的 Comand
有以下代码:
public abstract class Comand
{
public bool Valid { get; set; }
public abstract void Validate();
}
如何在执行HandlerAsync
中的实现代码之前隐式地使下面的代码运行? (有些东西像 ActionFilter Web API .NET)
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
您正在寻找装饰者模式。
基本上,您让 'base' CommandHandler 保持原样并让它完成它的工作,但是您添加了一个额外的 class 来实现相同的接口:
ExtraStuffCommandHandlerDecorator<TComand> : IHandler<TComand>
where TComand : Comand
{
readonly IHandler<TComand> _decorated;
public ExtraStuffCommandHandlerDecorator(IHandler<TComand> decorated)
{
_decorated = decorated;
}
public async Task<IResultComand> HandlerAsync(TComand comand)
{
// Do stuff before base command execution
IResultComand result = await _decorated.HandlerAsync(comand);
// Do stuff after base command execution
return result;
}
}
现在,您的调解器当前正在直接实例化和调用基本处理程序,应该查找装饰器并调用它,将基本处理程序作为构造函数参数传入。
Autofac 的 RegisterGenericDecorator 方法很好地支持使用装饰器。 Asp Core DI 的实现稍微复杂一些,但这里有一个指南。
我有一个只实现一种方法的接口:
public interface IHandler<T> where T : Comand
{
Task<IResultComand> HandlerAsync(T comand);
}
我在 类 中使用它如下:
public class ProductHandler : IHandler<NewProductComand>,
IHandler<EditProductComand>,
IHandler<DeleteProductComand>
public async Task<IResultComand> HandlerAsync(NewProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Create new product
return result;
}
public async Task<IResultComand> HandlerAsync(EditProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Edit product
return result;
}
public async Task<IResultComand> HandlerAsync(DeleteProductComand comand)
{
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
//Delete product
return result;
}
而我的 Comand
有以下代码:
public abstract class Comand
{
public bool Valid { get; set; }
public abstract void Validate();
}
如何在执行HandlerAsync
中的实现代码之前隐式地使下面的代码运行? (有些东西像 ActionFilter Web API .NET)
ResultComand result = new();
comand.Validate();
if (!comand.Valid)
{
return result;
}
您正在寻找装饰者模式。
基本上,您让 'base' CommandHandler 保持原样并让它完成它的工作,但是您添加了一个额外的 class 来实现相同的接口:
ExtraStuffCommandHandlerDecorator<TComand> : IHandler<TComand>
where TComand : Comand
{
readonly IHandler<TComand> _decorated;
public ExtraStuffCommandHandlerDecorator(IHandler<TComand> decorated)
{
_decorated = decorated;
}
public async Task<IResultComand> HandlerAsync(TComand comand)
{
// Do stuff before base command execution
IResultComand result = await _decorated.HandlerAsync(comand);
// Do stuff after base command execution
return result;
}
}
现在,您的调解器当前正在直接实例化和调用基本处理程序,应该查找装饰器并调用它,将基本处理程序作为构造函数参数传入。
Autofac 的 RegisterGenericDecorator 方法很好地支持使用装饰器。 Asp Core DI 的实现稍微复杂一些,但这里有一个指南。