У меня есть служба с именем ServiceConfiguration
, у которой ctor не по умолчанию. Я пытаюсь зарегистрировать его через Autofac с заводским методом:
builder.Register(c=>LoadConfiguration())
.As<ServiceConfiguration>();
А вот простой LoadConfiguration
метод:
private ServiceConfiguration LoadConfiguration() {
const string fileName = "app.json";
var json = File.ReadAllText(fileName, Encoding.UTF8);
var model = JsonConvert.DeserializeObject<ServiceConfiguration>(json);
return model;
}
Я ожидаю, что Autofac позвонит на LoadConfiguration
, когда я попросил решить ServiceConfiguration
Но, похоже, он пытается вызвать ctor
на ServiceConfiguration
. Например. позвонив по этой линии:
var c = container.Resolve<ServiceConfiguration>();
вызывает эту ошибку:
Autofac.Core.DependencyResolutionException: 'Произошла ошибка во время
активация определенной регистрации. Смотрите внутреннее исключение
для деталей. Регистрация: Activator = ServiceConfiguration
(ReflectionActivator), Services = [ServiceConfiguration], Lifetime =
Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared,
Ownership = OwnedByLifetimeScope '
и InnerException:
DependencyResolutionException: ни один из конструкторов не найден с
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' для типа
«ServiceConfiguration» может быть вызван с доступными службами и
параметры:
Не удается разрешить параметр «JobsConfiguration jobs» конструктора «Void .ctor (JobsConfiguration)».
Можете ли вы узнать, что мне не хватает?
UPDATE:
Я не пропускаю регистрацию JobsConfiguration
. На самом деле это не регистрируемый тип, и я не хочу его регистрировать. Я вообще не хочу, чтобы ctor
вызывали (служба получает сборку из файла json), вместо этого всякий раз, когда кто-то запрашивает ServiceConfiguration
, я хочу, чтобы Autofac вызывал LoadConfiguration()
и использовал возвращаемое значение.
UPDATE2:
Через некоторое время кажется, что извлечение интерфейса из ServiceConfiguration
- скажем, IServiceConfiguration
- и регистрация / разрешение интерфейса работает просто отлично. Но я не могу понять, почему! Я имею в виду это:
builder.Register(c=>LoadConfiguration())
.As<IServiceConfiguration>();
var c = container.Resolve<IServiceConfiguration>();
работает. Но конкретной версии нет. Так почему же? Какая разница?