Ну, я думаю, что это возможно, но не уверен, как это можно сделать.Вот мой сценарий: у меня есть 2 службы, одна зависит от другой, например:
public interface IServiceA {
//...
}
public interface IServiceB {
//...
}
//the actual implementation
public class ServiceA : IServiceA {
//...
}
public class ServiceB : IServiceB {
readonly IServiceA _serviceA;
public ServiceB(IServiceA serviceA){
_serviceA = serviceA;
}
}
У меня есть другой класс, использующий обе службы, подобные этому:
public class MyConsumer {
readonly IServiceA _serviceA;
readonly IServiceB _serviceB;
public MyConsumer(IServiceA serviceA, IServiceB serviceB){
_serviceA = serviceA;
_serviceB = serviceB;
}
}
Так что здесь я бынапример, serviceB
для инъекции с тем, что разрешено для serviceA
прямо здесь, в этом конструкторе MyConsumer
.(имеется в виду, что serviceA
, введенный в ServiceB
, должен быть именно экземпляром, serviceA
введенным в MyConsumer
, а не каким-то новым отличным экземпляром).Обратите внимание: я не хочу показывать ServiceA
через ServiceB
и просто сделать MyConsumer
зависимым только от IServiceB
(на самом деле ServiceA
является базовой услугой, в то время как другие службы, включая ServiceB
, являются просто расширениями, то естьможет быть больше сервисов, таких как ServiceB
в этом случае)
Я действительно новичок в Autofac и действительно даже с Unity (я использовал больше всего), я никогда не думал об этом сценарии раньше, поэтомуна самом деле у меня нет никакого кода, сделанного до сих пор.
Я надеюсь, что кто-то здесь уже сталкивался с тем же сценарием и мог бы предложить мне кое-что, спасибо!
Дополнительный вопрос: что если порядок параметров (переданный в MyConsumer
конструктор) будет изменен?Я имею в виду, это влияет на порядок разрешения и может привести к неожиданному результату?Если это возможно, порядок параметров не должен иметь значения (потому что MyConsumer
должен просто заботиться о том, что ему нужно, а не о том, как упорядочены необходимые ему вещи).
Более полное представление о проблеме Некоторые предлагали использовать defined scope
, который поддерживается в некоторых случаях autofac.Однако мой сценарий здесь другой, и я думаю, что не очень удобно заставлять autofac понимать, что я хочу.
Здесь MyConsumer
фактически никогда не может быть разрешен напрямую (с использованием метода .Resolve
), потому что он можетбыть просто зависимостью другого класса (это то, что мы называем .Resolve
).Используя scope convention
, я думаю, что это правильный подход, но область действия в моем случае отличается, я думаю, что он естественным образом определяется конструктором класса (все внедренные зависимости должны находиться в одной области видимости - и каждый экземпляр типа в этомсфера должна быть одноэлементной - которая разделяется между ними).Не уверен, почему этого не хватает из того, что Autofac может предоставить нам.