属性 使用 Unity 注入

Property injection with Unity

我遇到了统一问题,我想使用 属性 注入,这是我的代码中的内容: 容器配置:

public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<GTModelContainer, GTModelContainer>(new HttpContextLifetimeManager<GTModelContainer>())
                 .RegisterType<IUnitOfWork, UnitOfWorkGT>()
                 .RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager())                     
                 .RegisterType<ISocieteServices, SocieteServices>() ;
 }

社会服务 Class :

 public class SocieteServices : ISocieteServices
{
    private IUnitOfWork UnitOfWork;

    public SocieteServices(IUnitOfWork unitOfWork)
    {
        UnitOfWork = unitOfWork;
    }

}

我尝试使用 属性 注入(我不能使用带有自定义数据注释的构造函数注入),这里是我所做的:

   public class CodeSocieteUniqueAttribute : ValidationAttribute
{
     [Dependency]
    public ISocieteServices SocieteService {get; set;} 

     [InjectionMethod]
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {

        string codeSociete = value as string;

        var societe = SocieteService.getSocieteByCode(codeSociete);
        if (societe == null) return ValidationResult.Success;
        else return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));

    }
}

问题是 CodeSocieteUniqueAttribute class 中的 societeService 没有注入。

假设您用于注册类型的 class 可公开访问并且具有 IUnityContainer 对象,即:

public static class Resolver
{

    public static IUnityContainer Container { get; set; }
    public static void RegisterTypes(IUnityContainer container)
    {
        // type registrations here
        container.RegisterType<GTModelContainer, GTModelContainer>(new HttpContextLifetimeManager<GTModelContainer>())
             .RegisterType<IUnitOfWork, UnitOfWorkGT>()
             .RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager())                     
             .RegisterType<ISocieteServices, SocieteServices>() ;

        // Now, set the container
        Container = container;
    }
}

您可以访问您构建的容器并在方法执行期间解析这些类型。

例如,

public class CodeSocieteUniqueAttribute : ValidationAttribute
{
     [Dependency]
    public ISocieteServices SocieteService { get; set; } 

     [InjectionMethod]
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var societeServices = Resolver.Container.Resolve<ISocieteServices>();
        SocieteService = societeServices; // Or, you know, just use this since it's resolved.
        string codeSociete = value as string;

        var societe = SocieteService.getSocieteByCode(codeSociete);
        if (societe == null) return ValidationResult.Success;
        else return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));

    }
}

这实际上是非常标准的做法,this MSDN article 描述了在运行时解决项目。

另一种选择是将解析弹出到默认构造函数中,如下所示:

public class CodeSocieteUniqueAttribute : ValidationAttribute
{
    [Dependency]
    public ISocieteServices SocieteService {get; set;} 
    public CodeSocieteUniqueAttribute()
    {
        var societeServices = Resolver.Container.Resolve<ISocieteServices>();
        SocieteService = societeServices; 
    }
     // the rest of the class omitted for brevity
}