Внедрение в конструктор ядра asp.net с наследованием - PullRequest
0 голосов
/ 25 октября 2018

В моем основном приложении asp.net у меня есть классы зависимостей, которые внедряются почти во все сервисы.Поэтому я хочу создать базовый класс обслуживания, чтобы получить эти зависимости от свойств, и мои службы наследуют этот базовый класс обслуживания.

public abstract class BaseService
{
    protected Foo Foo { get; set; }
    protected Bar Bar { get; set; }

    public BaseService(Foo foo, Bar bar)
    {
        Foo = foo;
        Bar = bar;
    }
}
public class Service : BaseService
{
    public Service(IOtherDependency otherDependency) { }

    public void Method()
    {
        var value = Bar.value;
        Foo.Do(value);
    }
}

Так что с данным кодом он предупреждает меня вызвать базовый конструктор с предоставленными параметрами, однакоэто параметры, которые будут вводиться во время выполнения, я не хочу этого.Если я добавлю конструктор без параметров, он не будет вызывать мой параметризованный конструктор, который мне нужен.

Я не хочу вызывать или определять какой-либо класс, который внедряется в базовый сервис (Foo и Bar) внутри моегоунаследованный сервис, как я могу это сделать?

Кстати, классы Foo и Bar внедряются как одноэлементные в контейнер, если их время жизни важно.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это то, что я искал https://stackoverflow.com/a/48886242/2289430

Я изменил свой код для моей базы контроллера, как указано выше в посте.

За мою сторону обслуживания, которую я спрашивал в своем вопросе;так как они не используют HttpContext, как встроенный базовый класс Controller, я только внедряю класс IServiceProvider в свой BaseService, поэтому, что бы мне ни понадобилось во всех моих службах, я передаю его в свойство через provider.GetService().

public abstract class BaseService
{
    protected Foo Foo { get; set; }
    protected Bar Bar { get; set; }

    public BaseService(IServiceProvider provider)
    {
        Foo = provider.GetService<Foo>();
        Bar = provider.GetService<Bar>();
    }
}
public class Service : BaseService
{
    public Service(IOtherDependency otherDependency, IServiceProvider provider) : base(provider) { }

    public void Method()
    {
        var value = Bar.value;
        Foo.Do(value);
    }
}
0 голосов
/ 25 октября 2018

Вы не можете сделать это таким образом.

Если вы наследуете от базового класса, у которого нет конструктора по умолчанию, вы должны передать параметры конструктору производного класса и вызвать конструктор базового класса с помощьюнапример,

public abstract class BaseService
{
    protected Foo Foo { get; set; }
    protected Bar Bar { get; set; }

    public BaseService(Foo foo, Bar bar)
    {
        Foo = foo;
        Bar = bar;
    }
}

public class Service : BaseService
{
    public Service(IOtherDependency otherDependency, Foo foo, Bar bar) : base(foo, bar) { }
}

Компилятор хочет создать базовый класс, но для этого нужны параметры.Представьте себе сценарий, если у вас есть 2 конструктора в базовом классе

public abstract class BaseService
{
    public BaseService(Foo foo)
    {
        ...
    }

    public BaseService(Bar bar)
    {
        ...
    }
}

В этом сценарии какой конструктор базового класса вызывает компилятор из производного класса?Вы должны быть явными с параметризованными конструкторами, поэтому вам нужно также передать их любым производным конструкторам.

...