Я использую autofac 3.5.x и я имею установку, подобную этой:Вводят зависимость с «конструктора сферы» - autofac
public class ServiceA : IServiceA { }
public class ServiceB : IServiceB { public ServiceB(IServiceA sa) { } }
public class ServiceC : IServiceC { public ServiceC(IServiceA sa) { } }
public class ServiceD : IServiceD { public ServiceD(IServiceA sa, IServiceB sb, IServiceC sc) {} }
В моем контейнере у меня есть следующие регистрации:
builder.RegisterType<ServiceA>.As<IServiceA>();
builder.RegisterType<ServiceB>.As<IServiceB>();
builder.RegisterType<ServiceC>.As<IServiceC>();
builder.RegisterType<ServiceD>.As<IServiceD>();
Вот что я хочу: Когда я запрошу новый контейнер IServiceD
из контейнера, я хочу, чтобы тот же экземпляр IServiceA
был введен в IServiceD
и его зависимости IServiceB
и IServiceC
. Тем не менее, я не ищу глобальную область синглов. В следующий раз, когда я попрошу экземпляр IServiceD
, должен создать с новым экземпляром IServiceA
(я знаю, что вы не можете создать экземпляр интерфейса, но я думаю, что вы поняли суть).
Для иллюстрации; когда я прошу autofac контейнер в течение IServiceD
я хочу следующее произойдет:
public class ServiceD : IServiceD
{
public ServiceD(IServiceA sa, IServiceB sb, IServiceC sc)
{
// SA should be the same (but it is not)
sa.GetHashCode() == sb.GetServiceA().GetHashCode() == sc.GetServiceA().GetHashCode()
}
}
Пожалуйста, обратите внимание, что метод GetServiceA()
включается только для иллюстрации моей точки.
Так что да, я предполагаю, что я ищу какой-нибудь способ, чтобы сказать autofac, что, когда он решает IServiceD
он должен создать синглтон из ServiceA
, но только для сферы конструктора ServiceD
«s.
Прямо сейчас, я использую autofacs поддержку делегатов заводов и попросить:
public ServiceD(IServiceA sa, Func<IServiceA, IServiceB> fb, Func<IServiceA, IServiceC> fc) : IServiceD
{
var sb = fb(sa); // Manually inject the same instance of ServiceA
var sc = fc(sa); // Manually inject the same instance of ServiceA
// ServiceA is now the same instance
sa.GetHashCode() == sb.GetServiceA().GetHashCode() == sc.GetServiceA().GetHashCode()
}
Это заставляет меня идти, но у меня есть чувство, что это может быть сделано лучше, - вот почему я обращаюсь к экспертов.
Заранее благодарен.
Привет, Кирилл, жаль, что принял ваш ответ этим поздно. Я ценю ваш вклад. Ваш совет относительно 'InstancePerLifetimeScope()' был тем, который мне нужно было продолжить. Благодарю. –