У меня есть интерфейс и класс репозитория. У меня также есть служебный интерфейс и класс, которые зависят от интерфейса репозитория. Типичный DI. Моя цель - добавить кеширование между сервисом и репозиторием, а не коснуться службы или репозитория. Вот код:Как зарегистрировать круглый тип в Autofac?
public class CachedCustomerRepository : ICustomerRepository
{
private readonly ICustomerRepository _repository;
private readonly ConcurrentDictionary<int, Customer> _cache;
public CachedCustomerRepository(ICustomerRepository repository)
{
if (repository == null)
throw new ArgumentNullException("repository");
this._repository = repository;
this._cache = new ConcurrentDictionary<int, Customer>();
}
}
Я сделал это с замком Виндзор. Я просто добавил класс, и он работал сразу, без каких-либо изменений в регистрации. Для меня это был потрясающий эффект! :) Теперь я пытаюсь сделать то же самое с Autofac, но с ошибкой. Он жалуется на круговую зависимость, и я не знаю, как ее зарегистрировать.
Edit - здесь регистрация:
builder.RegisterAssemblyTypes(typeof(ICustomerRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.SingleInstance();
Edit - вот регистрация в настоящее время:
builder.RegisterAssemblyTypes(typeof(ICustomerRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository") && !t.Name.StartsWith("Cached"))
.AsImplementedInterfaces()
.SingleInstance();
и после этого будет регистрация для каждого кэшированного хранилища.
Пожалуйста, обновите ваш пост с текущим регистрационным кодом Autofac и точное сообщение об ошибке! – nemesv
Для этого Autofac имеет метод [RegisterDecorator] (http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4/). – Steven