У меня есть то, что, казалось бы, относительно распространенным сценарием. Мне нужно ввести зависимость, которая требует конструктора.Как настроить инъекции конструктора в NServiceBus
У меня есть репозиторий, который выглядит следующим образом:
public class ApprovalRepository : IApprovalRepository
{
private readonly MongoCollection<Approval> _collection;
public ApprovalRepository(MongoDatabase database)
{
this._collection = database.GetCollection<Approval>("Approvals");
}
// ...
}
конечная точка конфигурации, которая выглядит следующим образом:
public class EndpointConfig : IConfigureThisEndpoint,
AsA_Server, IWantCustomInitialization
{
public void Init()
{
NServiceBus.Configure.With().DefaultBuilder().JsonSerializer();
}
}
и обработчик, который выглядит следующим образом:
public class PlaceApprovalHandler : IHandleMessages<PlaceApproval>
{
public IApprovalRepository ApprovalRepository { get; set; }
public void Handle(PlaceApproval message)
{
//
ApprovalRepository.Save(
new Approval
{
Id = message.Id,
Message = message.MessageText,
ProcessedOn = DateTime.UtcNow
});
}
}
Затем у меня есть класс для выполнения пользовательской инициализации:
public class ConfigureDependencies : IWantCustomInitialization
{
public void Init()
{
// configure Mongo
var client = new MongoClient("mongodb://localhost:27017/?safe=true");
var server = client.GetServer();
var database = server.GetDatabase("ServiceBusTest");
Configure.Instance.Configurer.RegisterSingleton<IApprovalRepository>(new ApprovalRepository(database));
}
}
В результате ошибка:
2013-04-11 17:01:03,945 [Worker.13] WARN NServiceBus.Unicast.UnicastBus [(null)] <(null)> - PlaceApprovalHandler failed handling message.
Autofac.Core.DependencyResolutionException: Circular component dependency detected: Server.PlaceApprovalHandler -> Server.ApprovalRepository -> Server.ApprovalRepository.
at Autofac.Core.Resolving.CircularDependencyDetector.CheckForCircularDependency(IComponentRegistration registration, Stack`1 activationStack, Int32 callDepth) in :line 0
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) in :line 0
Я не знаком с Autofac. Я также попытался следующие, которые также имели аналогичный результат:
Configure.Instance.Configurer.ConfigureComponent(() => new ApprovalRepository(database), DependencyLifecycle.SingleInstance)