Я использую CacheManager и использует фабрику для создания экземпляров. Я не хочу регистрировать каждый тип ICacheManager, который я объявляю, поэтому я ищу способ зарегистрировать общий тип с помощью метода динамической разрешимости. Используя Ninject, я мог бы сделать это:Регистрация Autofac разрешена методом
kernel
.Bind(typeof(ICacheManager<>))
.ToMethod((context) => CacheFactory.FromConfiguration(context.GenericArguments[0], "defaultCache"))
.InSingletonScope();
где context.GenericArguments [0] будет тип моей родовой. Например, объект от
ICacheManager<object> cache;
Как мне сделать что-то подобное с помощью Autofac?
Редактировать
Рабочая IRegistrationSource на основе ответа Кирилловской ниже. SingleInstance требуется, поскольку CacheManager добавляет ключи с идентификатором экземпляра CacheManager.
public class CacheManagerRegistrationSource : IRegistrationSource
{
public Boolean IsAdapterForIndividualComponents
{
get
{
return false;
}
}
public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
{
IServiceWithType typedService = service as IServiceWithType;
if (typedService == null || !typedService.ServiceType.IsGenericType)
{
yield break;
}
Type cacheManagerType = typedService.ServiceType;
if (cacheManagerType.GetGenericTypeDefinition() != typeof(ICacheManager<>))
{
yield break;
}
IComponentRegistration registration = (IComponentRegistration)RegistrationBuilder.ForDelegate(cacheManagerType, (c, p) =>
{
return CacheFactory.FromConfiguration(cacheManagerType.GetGenericArguments()[0], "defaultCache");
})
.SingleInstance()
.CreateRegistration();
yield return registration;
}
}
Спасибо. Твой ответ был почти точным. Я опубликовал рабочий код в моем вопросе. –