所以我有一個抽象工廠類的,這種想法是,在這家工廠的構造,我會從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>>
你想要的是同時使用協變和逆變,這是不可能的。你需要變相嗎? –