Как реализовать внедрение зависимостей в Startup.cs, когда зависимости циклические? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть MyProject проект, где у меня есть IMyService интерфейс и MyService класс, который реализует IMyService.В классе Startup.cs I их внедрение зависимостей:

// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyService, MyService>();
}

Поскольку MyService имеет много зависимостей (делает много вызовов REST сторонним разработчикам и т. Д.), Я хотел бы создать его заглушку для среды разработки,Я создал новый MyStubsProject , который ссылается на MyProject .И я реализовал заглушку версии IMyService в MyStubsProject :

// MyStubsProject project
public class MyStubService : IMyService
{
    ...
}

Так что теперь я хочу добавить внедрение зависимостей в класс Startup.cs:

// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    if (isDevelopmentEnvironment)
        services.AddScoped<IMyService, MyStubService>();
    else
        services.AddScoped<IMyService, MyService>();
}

Но если я добавлю это, то будет * круговая зависимость между MyProject и MyStubsProject .

Как мне реализовать ссылку на класс MyStubService или MyStubsProject проект в Startup.cs?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Лучший ответ, вероятно, состоит в том, чтобы выделить ваш сервисный сервис в отдельный проект - по крайней мере, контракты на обслуживание (IMyService).Это должно позволить обоим вашим существующим проектам ссылаться на сервисные контракты без каких-либо конфликтов.Если вы хотите добавить другие интерфейсы или добавить другие реализации того же интерфейса, теперь это тоже будет легко.

Дополнительным преимуществом может быть улучшение общей архитектуры: хранение контрактов в отдельном проекте, который не содержит никакой реальной логики (только интерфейсы), обычно приводит к лучшей организации и более чистому коду.

0 голосов
/ 14 декабря 2018

Вы можете использовать директиву прекомпилятора # if , чтобы определить, настроен ли ваш проект на отладку или выпуск.Компилятор сделает все остальное!

// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
#IF DEBUG
        services.AddScoped<IMyService, MyStubService>();
#ELSE
        services.AddScoped<IMyService, MyService>();
#ENDIF
}
...