所以我有一个抽象工厂类的,这种想法是,在这家工厂的构造,我会从autofac所有已注册的服务我很感兴趣的IEnumerable
通过在这个工厂有一个传递参数的方法,代码将遍历IEnumerable
并返回匹配的服务。容易如馅饼,抽象的工厂模式。解决通用的IEnumerable的构造函数中使用Autofac
的问题是,我最近在我的接口工厂返回引入了泛型类型,我不知道怎么写的构造函数,因此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>>
你想要的是同时使用协变和逆变,这是不可能的。你需要变相吗? –