我有一个基于实体的模型,所有实体都继承自BaseEntity
public class BaseEntity{}
public class ClientEntity:BaseEntity{}
public class SpecialClientEntity:ClientEntity{}
public class ProductEntity:BaseEntity{}
public class SpecialProductEntity:ProductEntity{}
我这个界面
public interface IValidationRule<out T>
{
bool IsValid(object parameter);
}
例如,我试图做的就是注册验证规则
public class BaseValidationRule:IValidationRule<BaseEntity>{}
public class ClientValidationRule:IValidationRule<ClientEntity>{}
public class SpecialClientValidationRule:IValidationRule<SpecialClientEntity>{}
public class ProductValidationRule:IValidationRule<ProductEntity>{}
public class SpecialProductValidationRule:IValidationRule<SpecialProductEntity>{}
我想要这个结果
foreach (var foo in container.ResolveAll<IValidationRule<SpecialClientEntity>>())
{
Console.WriteLine(foo);
}
并获得3个第一个验证规则而不是2个最后一个验证规则,我该如何注册?而不是多次注册。
答案 0 :(得分:2)
我不熟悉团结,但这可能有用
container.ResolveAll(typeof(IValidationRule<>));
以下方法也是一种选择
public interface IValidationRule{
bool IsValid(object parameter);
}
public interface IValidationRule<out T> : IValidationRule
{
}
var foo in container.ResolveAll<IValidationRule>();
用于注册统一服务
RegisterType(typeof(IValidationRule<BaseEntity>), typeof(BaseValidationRule));
RegisterType(typeof(IValidationRule<ClientEntity>), typeof(ClientValidationRule), "Name-1");
RegisterType(typeof(IValidationRule<SpecialClientEntity>), typeof(SpecialClientValidationRule), "Name-2");
RegisterType(typeof(IValidationRule<ProductEntity>), typeof(ProductValidationRule), "Name-3");
RegisterType(typeof(IValidationRule<SpecialProductEntity>), typeof(SpecialProductValiationRule), "Name-4");
并获得3个第一个验证规则而不是2个最后一个验证规则,我该如何注册?而不是多次注册。
一定有某种东西可以将这三个区别开来。这可以是接口。
之后,您可以使用反射来获取属于该特定接口的类型
反射示例:
Assembly.GetExecutingAssembly().GetTypes().Where(mytype => mytype.GetInterface(typeof(ISeperatorInterface<>).Name) != null && mytype.IsClass)
使您键入为Type。然后您可以通过以下方式解决它们:
.Resolve(<myType>);
var types = Assembly.GetExecutingAssembly().GetTypes().Where(mytype => mytype.GetInterface(typeof(ISeperatorInterface<>).Name) != null && mytype.IsClass);
foreach (var type in types)
container.Resolve(type);