我正在尝试构建一个结构,其中我有一个基本的ivalidator接口,该接口将基于一些元数据为我们的系统生成。我们希望给未来的开发人员提供1的灵活性:如果不干扰任何手写代码,则重新生成iValualSt>的具体实现;2)将装饰器添加到iValueSt>可以扩展功能,而不干扰自动生成的代码。我想有一些方法在运行时使用简单注入器的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类型,否则会抛出一个错误,所以解析另一个泛型似乎是不可能的。我不知道该怎么办。有办法这样做吗?有没有更好的方法在不使用装饰器的情况下获得预期的功能?我们在考虑部分课程,但这也有自己的问题。任何帮助都将不胜感激! (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您可以使用复合验证器根据需要添加IValidator<>实现,而不是插入装饰器。此解决方案将允许代码包含同一类型的多个IValidator<>。在内部,您的代码仍然可以依赖于一个IValidator<T>,该CompositeValidator将解析为assemblies,该IValidator<User>将调用零个或多个验证器,具体取决于运行时在容器中注册了什么。复合验证器:public class CompositeValidator<T> : IValidator<T>{ public readonly IEnumerable<IValidator<T>> validators; public CompositeValidator(IEnumerable<IValidator<T>> validators) { this.validators = validators; } public void Validate(T item) { foreach(var validator in this.validators) { validator.Validate(item); } }}容器的配置如下:var assemblies = new[] { typeof(IValidator<>).Assembly };var container = new Container();container.RegisterCollection(typeof(IValidator<>), assemblies);container.Register(typeof(IValidator<>), typeof(CompositeValidator<>));其中container.GetInstance<IValidator<User>>()变量包含要搜索验证器的所有程序集。当您使用CompositeValidator<User>或通过构造函数注入解析IValidator<User>时,您将返回,它在内部引用任何和所有的。 (adsbygoogle = window.adsbygoogle || []).push({});
09-25 20:41