【问题标题】:How to Resolve Generic Class With Unity Container Resolved Generic Interface as Constructor Parameter如何使用 Unity Container 解析的泛型接口作为构造函数参数来解析泛型类
【发布时间】:2012-02-06 07:27:01
【问题描述】:

我不知道如何在我的 Unity (2.0) 容器中注册一个具有注入通用接口的通用抽象类。这是接口和类:

public interface IReportFactory<in TEntity, out TReport>
{ ... }

public class ExperienceReportBaseFactory :
    IReportFactory<Experience, ExperienceReportBase>
{ ... }

public abstract class ReportProvider<TEntity, TReport>
{
    protected ReportProvider(
        IReportFactory<TEntity, TReport> reportFactory)
    { ... }
    ...
}

public class ExperienceDetailsReportProvider
    : ReportProvider<Experience, ExperienceReportBase>
{
    public ExperienceDetailsReportProvider(
        IReportFactory<Experience, ExperienceReportBase>
        reportFactory)
        : base(reportFactory) { ... }
    ...
}

这是注册码:

Container.RegisterInstance(typeof(IReportFactory<Experience, ExperienceReportBase>), new ExperienceReportBaseFactory())
         .RegisterType(typeof(ReportProvider<Experience, ExperienceReportBase>),
             typeof (ExperienceDetailsReportProvider),
             new InjectionConstructor(Container.Resolve(typeof (IReportFactory<Experience, ExperienceReportBase>))));

这是我试图解决ReportProvider&lt;,&gt; 的提供程序工厂:

public class ReportProviderFactory<TEntity> : IReportProviderFactory<TEntity>
{
    private readonly IServiceLocator _serviceLocator;

    public ReportProviderFactory(IServiceLocator serviceLocator)
    {
        _serviceLocator = serviceLocator;
    }

    public ReportProvider<TEntity, TReport> Create<TReport>()
        where TReport : ActiveReport
    {
        var reportProvider =
            _serviceLocator.GetService(typeof (ReportProvider<TEntity, TReport>)) as
                ReportProvider<TEntity, TReport>;
        return reportProvider;
    }
}

我在_serviceLocator.GetService(...) 行收到“无法构造类型 ReportProvider`2。您必须配置容器以提供此值”。

【问题讨论】:

    标签: generics dependency-injection unity-container ioc-container service-locator


    【解决方案1】:

    我是个白痴...调用ReportProviderFactory&lt;Experience&gt;.Create&lt;&gt;() 的客户端正在为TReport 指定不同的类型:

    var reportProvider = _reportProviderFactory<Experience>.Create<ExperienceDetailsReport>();
    

    这意味着我在 ExperienceReportBaseFactoryExperienceDetailsReportProvider 上的 TReport 类型错误,因为客户端正在使用 .应该是:

    public class ExperienceReportBaseFactory : IReportFactory<Experience, ExperienceDetailsReport> { ... }
    
    public class ExperienceDetailsReportProvider : ReportProvider<Experience, ExperienceDetailsReport>
    {
        public ExperienceDetailsReportProvider(IReportFactory<Experience, ExperienceDetailsReport> reportFactory) : base(reportFactory) { ... }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      相关资源
      最近更新 更多