gpt4 book ai didi

c# - 为抽象通用类型返回适当的具体类型

转载 作者:行者123 更新时间:2023-11-30 22:39:26 31 4
gpt4 key购买 nike

我在 StructureMap 配置方面遇到了困难。我有一个接受 Func 作为其验证工厂的 ValidationProvider。我需要使用结构图提供它,以便它知道它应该返回什么验证器(抽象)的实现。我猜你已经很困惑了,所以这里有一些代码可以解决问题:

public class ValidationProvider : IValidationProvider
{
private readonly Func<Type, IValidator> _validatorFactory;

public ValidationProvider(Func<Type, IValidator> validatorFactory)
{
_validatorFactory = validatorFactory;
}

如您所见,验证提供程序将确定需要 IValidator 的哪些实现的功能委托(delegate)给 validatorFactory。我还有实现 IValidator 的验证器。

public abstract class Validator<T> : IValidator
{
IEnumerable<ValidationResult> IValidator.Validate(object entity)
{
if (entity == null) throw new ArgumentNullException("entity");

return this.Validate((T)entity);
}

protected abstract IEnumerable<ValidationResult> Validate(T entity);
}

然后我为每个需要验证的实体创建一个 Validator 实例,例如:

public sealed class BidValidator : Validator<Bid>
{
protected override IEnumerable<ValidationResult> Validate(Bid bid)
{
if (bid.User.HasEnoughCredits(bid.Item.Category.ListingPrice) == false)
yield return new ValidationResult("InsufficientCredits", "Not enough credits.");
if(bid.Item.IsValidBidAmount(bid.Amount) == false)
yield return new ValidationResult("Amount", "Bid amount has to be higher than last posted bid.");
if(bid.User.OwnsItem(bid.Item.Id))
yield return new ValidationResult("InvalidBidder", "User cannot bid on his/her own items.");
}
}

我有一个 NullValidator,当没有抽象验证器的实现时,它应该是默认值

public sealed class NullValidator<T> : Validator<T>
{
protected override IEnumerable<ValidationResult> Validate(T entity)
{
return Enumerable.Empty<ValidationResult>();
}
}

所以现在在 StructureMap 中我需要将所有东西联系在一起,但我无法让它工作......这是我得到的:

            x.For(typeof(Validator<>)).Use(typeof(NullValidator<>));
x.For<Validator<Bid>>().Use<BidValidator>();
x.For<Validator<Rating>>().Use<RatingValidator>();
x.For<Validator<TopLevelCategory>>().Use<TopLevelCategoryValidator>();
});

Func<Type, IValidator> validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type.GetType());
return (IValidator) ObjectFactory.GetInstance(valType);
};

container.Configure(x => x.For<IValidationProvider>().Use(() => new ValidationProvider(validatorFactory)));

但是说 return (IValidator) ObjectFactory.GetInstance(valType); 的那行一直抛出这个异常:

StructureMap Exception Code: 202 No Default Instance defined for PluginFamily Sharwe.Services.Validation.Validator`1[[System.RuntimeType, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Sharwe.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

有什么方法可以连接起来吗?

P.S:如果有更简单的方法来做到这一点,我会很高兴知道。这不是我实现的,我只是喜欢它并且认为值得一试......

最佳答案

更改以下代码:

Func<Type, IValidator> validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type.GetType());
return (IValidator) ObjectFactory.GetInstance(valType);
};

收件人:

Func<Type, IValidator> validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type);
return (IValidator) ObjectFactory.GetInstance(valType);
};

您正在提供一个 Type 参数并调用 type.GetType() ,它将返回该 Type< 的类型 Type 实例... 嗯嗯.. 还在跟着我吗?异常消息实际上说明了一切:

No Default Instance defined for Validator<System.RuntimeType>

关于c# - 为抽象通用类型返回适当的具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721600/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com