【发布时间】:2016-08-15 01:12:33
【问题描述】:
所以我有一个抽象工厂类,想法是在这个工厂的构造函数中,我将从 autofac 传递我感兴趣的所有注册服务的IEnumerable。这个工厂里有个方法传一个参数,代码会循环遍历IEnumerable,返回匹配的服务。像馅饼一样简单,抽象工厂模式。
问题是,我最近在工厂返回的接口中引入了一个泛型类型,我不确定如何编写构造函数,所以 autofac 知道仍然返回所有注册的服务,并从本质上忽略泛型。
一些代码:
我的界面:
public interface IRunnerServices<in T>
{
void Create(T entity);
}
接口的一些实现
public class RunnerServiceA : IRunnerServices<A>
{
public void Create(A entity);
}
public class RunnerServiceB : IRunnerServices<B>
{
public void Create(B entity);
}
public class RunnerServiceC : IRunnerServices<C>
{
public void Create(C entity);
}
// Many, many more...
在我的作文根目录中,我像这样注册这些服务
builder.RegisterType<RunnerServicesA>().As<IRunnerServices<A>>();
builder.RegisterType<RunnerServicesB>().As<IRunnerServices<B>>();
builder.RegisterType<RunnerServicesC>().As<IRunnerServices<C>>();
你知道,A、B、C 都继承自同一个基类
public class A : LetterBase
{ }
public class B : LetterBase
{ }
public class C : LetterBase
{ }
现在,我的抽象工厂
public class RunnerServicesFactory
{
private readonly IEnumerable<IRunnerServices<????>> _candidates;
public RunnerServicesFactory(IEnumerable<IRunnerServices<????>> candidates)
{
_candidates = candidates;
}
public IRunnerServices<????> Create(int discriminator)
{
return _candidates.First(c => c.Discriminator == discriminator);
}
}
问题在于我在上面的构造函数和其他声明中提供了什么????让 autofac 知道它应该传入这个泛型的所有注册服务?
我已经尝试过了,但没有运气,因为 autofac 什么都没通过
IEnumerable<IRunnerServices<LetterBase>>
【问题讨论】:
-
你想要的是同时使用协变和逆变,这是不可能的。你需要逆变吗?
标签: c# ienumerable autofac abstract-factory