考慮以下層次結構:
我需要解決的ProducerRepository
每個註冊IParser
依賴一個實例時IEnumerable<ISourceRepository<IDatum>>
得到解決。autofac:註冊同一類不止一次與不同的相關
public class ProducerRepository : ISourceRepository<Data>
{
public ProducerRepository(IRepository repository)
{}
}
public interface ISourceRepository<out T> where T : class, IDatum
{}
public class Repository : IRepository
{
public Repository(IParser parser)
{}
}
public class ParserTypeOne : IParser {}
public class ParserTypeTwo : IParser {}
我需要註冊ProducerRepository
如下。
builder.RegisterType<ProducerRepository>()
.WithParserTypeOne() // how do I specify this as a particular dependency
.As<ISourceRepository<IDatum>();
builder.RegisterType<ProducerRepository>()
.WithParserTypeTwo() // another type of parser.
.As<ISourceRepository<IDatum>>();
// OR: better still if at all possible...
builder.RegisterType<ProducerRepository>() // one of these for each underlying dependency
.WithEachPossibleTypeOfParser() // one for each dependency
.As<ISourceRepository<IDatum>>();
我需要知道如何註冊類兩次,一次與每種類型的依賴,這樣,當一個IEnumerable<ISourceRepository<IDatum>>
解決我得到ProducerRepository的一個單獨的實例爲每個不同的實現解析器。
更好的是,能夠爲在程序集掃描中找到的解析器的每個實例註冊一個單獨的ProducerRepository
並添加它將會很好。
我一直希望不必更改實現來使用Keyed
或Meta
註冊,因爲它會鎖定每個依賴項並更改實現。如果這是做到這一點的唯一方法,我會接受答案。 我希望通用的方式來註冊所有可能的實現。
非常感謝您的詳細回覆。我已經開始爲這些服務進行明確的註冊。感謝您的提示。 – Jim 2015-03-03 19:01:49