这是界面定义:
public interface IEtlProcess<out X, out X1, out Y, out Y1, out Z, out Z1> : IEtlProcessC<X, X1, Y, Y1>
where X : IExtractJob<X1>
where X1 : IExtractResult
where Y : ITransformJob<X1, Y1>
where Y1 : ITransformResult
where Z : ILoadJob<Y1, Z1>
where Z1 : ILoadResult
{
Y TransformJob { get; }
Z LoadJob { get; }
ExtractDefinition ExtractDefinition { get; }
}
并且实现看起来像这样:
public class StatisticsEtlProcess : IEtlProcess<StatisticsExtractJob, StatisticsExtractResult, StatisticsTransformJob, StatisticsTransformResult, StatisticsLoadJob, StatisticsLoadResult>
{
public IServiceConfiguration ServiceConfiguration { get; set; }
public StatisticsExtractJob ExtractJob
{
get
{
return new StatisticsExtractJob(ExtractDefinition);
}
}
public StatisticsLoadJob LoadJob
{
get
{
return new StatisticsLoadJob(ExtractDefinition);
}
}
public StatisticsTransformJob TransformJob
{
get
{
return new StatisticsTransformJob(ExtractDefinition);
}
}
public ExtractDefinition ExtractDefinition
{
get
{
return new ExtractDefinition();
}
}
}
没什么太花哨的,但不幸的是我在尝试将具体实现融入这种类型的列表时遇到了一些问题:
private IList<IEtlProcess<IExtractJob<IExtractResult>, IExtractResult, ITransformJob<IExtractResult, ITransformResult>,
ITransformResult, ILoadJob<ITransformResult, ILoadResult>, ILoadResult>> _etlProcesses;
我创建了一些其他界面来帮助我调试问题:
public interface IEtlProcessC<out X, out X1, out Y, out Y1> : IEtlProcessB<X, X1>
where X : IExtractJob<X1>
where X1 : IExtractResult
where Y : ITransformJob<X1, Y1>
where Y1 : ITransformResult
{ }
public interface IEtlProcessB<out X, out X1> : IEtlProcessA
where X : IExtractJob<X1>
where X1 : IExtractResult
{
X ExtractJob { get; }
}
public interface IEtlProcessA
{ }
我可以让这个工作:
var aaa = (IEtlProcessB<IExtractJob<IExtractResult>, IExtractResult>)instance;
但不是这样:
var bbb = (IEtlProcessC<IExtractJob<IExtractResult>, IExtractResult, ITransformJob<IExtractResult, ITransformResult>, ITransformResult>)instance;
基本上提高了演员阵容。 intance变量是StatisticsEtlProcess类型的intance。通用模板似乎是正确的,但我肯定错过了一些东西。提前致谢
更新1
public interface IExtractJob<out T> where T : IExtractResult
{
T Extract(FileInfo file);
}
public interface ILoadJob<T, out TZ> where T : ITransformResult where TZ : ILoadResult
{
TZ Load(T transformResult);
}
public interface ITransformJob<T, out TZ> : IJob where T : IExtractResult where TZ : ITransformResult
{
TZ Transform(T extractResult);
}