统一容器解析协方差

时间:2019-01-10 22:34:01

标签: c# unity-container

我有一个基于实体的模型,所有实体都继承自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个最后一个验证规则,我该如何注册?而不是多次注册。

1 个答案:

答案 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);