【发布时间】:2016-06-07 08:14:00
【问题描述】:
我正在尝试构建一个结构,其中我有一个基本的 IValidator 接口,该接口将基于一些元数据为我们的系统生成。我们希望为未来的开发人员提供以下灵活性:1)如果需要,在不干扰任何手写代码的情况下重新生成 IValidator 的具体实现;2)向 IValidator 添加装饰器,以便能够在不干扰自动执行的情况下扩展功能。生成的代码。
我想有一些方法在运行时使用 Simple Injector 的 RegisterDecorator 方法解析通用装饰器,这样我们的开发团队就不需要在每次添加装饰器时都去更新组合根。
这里有一些示例类/接口
public interface IValidator<T> where T : class
{
void Validate(T entity);
}
public class ClientValidator : IValidator<Client>
{
public void Validate(Client entity)
{
//Auto-generated
}
}
public class UserValidator : IValidator<User>
{
public void Validate(User entity)
{
//Auto-generated
}
}
public class ClientValidatorDecorator : IValidator<Client>
{
private readonly IValidator<Client> clientValidator;
public ClientValidatorDecorator(IValidator<Client> clientValidator)
{
this.clientValidator = clientValidator;
}
public void Validate(Client entity)
{
//New rules
this.clientValidator.Validate(entity);
}
}
public class UserValidatorDecorator : IValidator<User>
{
private readonly IValidator<User> userValidator;
public UserValidatorDecorator(IValidator<User> userValidator)
{
this.userValidator = userValidator;
}
public void Validate(User entity)
{
//New rules
this.userValidator.Validate(entity);
}
}
public class ValidationContext
{
private readonly IValidator<Client> client;
private readonly IValidator<User> user;
public ValidationContext(IValidator<Client> client, IValidator<User> user)
{
this.client = client;
this.user = user;
}
}
我们正在尝试这样做:
public void RegisterServices(Container container)
{
container.Register(typeof(IValidator<>), AssemblyManifest.GetAssemblies());
container.RegisterDecorator(typeof(IValidator<>), GetType, Lifestyle.Transient, UseType);
}
private static Type GetType(DecoratorPredicateContext ctx)
{
//Return appropriate Decorator
}
private static bool UseType(DecoratorPredicateContext ctx)
{
//Predicate
}
不幸的是,除非我解决具体类型 RegisterDecorator 会引发错误,否则似乎解决了另一个泛型。我不确定如何进行。有没有办法做这样的事情?有没有更好的方法在没有装饰器的情况下获得预期的功能?我们正在考虑部分类,但这有其自身的一系列问题。
任何帮助将不胜感激!
【问题讨论】:
标签: c# generics dependency-injection decorator simple-injector