Использование внедрения зависимостей с библиотекой классов .NET Core (.NET Standard)

Я перешел по ссылке:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection

и узнал, как я могу использовать внедрение зависимостей для веб-API.

Как упоминалось в приведенной выше ссылке, я могу использовать класс Startup (Startup.cs) для внедрения зависимостей внутри уровня API. Но как добиться внедрения зависимостей для библиотеки классов .NET Core. На скриншоте ниже показано, как я добавляю библиотеку классов. введите описание изображения здесь

И моя структура проекта

введите описание изображения здесь

В проекте «DataManagement.Repository» я написал класс «UserRepository», а в проекте «DataManagement.Repository.Interfaces» написал интерфейс «IUserRepository».

В проекте «DataManagement.Business» я написал класс «UserManager».

class UserManager
    {
        private IUserManager _userManager;
        public UserManager(IUserManager userManager)
        {
            _userManager = userManager;
        }
    }

Как видите, я пытаюсь добиться внедрения зависимостей через конструктор.

Но я не уверен, какие изменения необходимо внести для включения внедрения зависимостей внутри библиотеки классов .NET Core (.NET Standard).


person Banketeshvar Narayan    schedule 25.12.2016    source источник


Ответы (1)


Вам не нужно ничего делать в своей библиотеке классов. Только основное приложение имеет корневой каталог композиции (самый ранний момент в жизненном цикле приложения, который вы можете настроить свой объектный граф).

Это происходит в Startup.cs вашего приложения ASP.NET Core. Там же вы регистрируете свои зависимости:

services.AddScoped<IUserManager,UserManager>();

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

Однако вы можете предоставить удобные методы для выполнения этой регистрации, например метод AddXxx, распространенный в ASP.NET Core, или какую-то модульную систему, например, в сторонних контейнерах IoC, таких как Autofac или Castle Windsor.

person Tseng    schedule 26.12.2016
comment
как вы сказали в ответе, если я добавлю эту зависимость в Startup.cs om asp.net core application, а затем добавлю ссылку на библиотеку классов .NetCore, я могу ее использовать? - person pejman; 27.12.2016
comment
Да, если вы полностью используете внедрение зависимостей (и никогда не создаете экземпляр службы new), она будет работать - person Tseng; 27.12.2016
comment
Я задал вопрос по этой теме в http://stackoverflow.com/questions/41342064/using-ihostingenvironment-in-netcore-library, пожалуйста, помогите мне, если сможете. Благодарность - person pejman; 27.12.2016
comment
Должен ли проект .Api иметь ссылку на проект .Repository для доступа к реализациям интерфейсов .Repository? - person WillC; 26.01.2019
comment
@WillC: Да, поскольку корень вашей композиции - это веб-приложение. Вы можете немного абстрагироваться от этого, используя методы расширения (такие как ASP.NET Core с .AddXyz, где вы выполняете регистрацию в методе .AddXyz`. - person Tseng; 26.01.2019
comment
Вы можете дополнительно скрыть транзитивные зависимости с помощью <ProjectReference Include="..\ClassLibrary\ClassLibrary.csproj" PrivateAssets="All" /> (добавив PrivateAssets="All" к ссылке (в вашем Xyz.Extensions.DependencyInjection проекте, содержащем .AddXyzmethod). Это скроет конкретные реализации в вашем основном приложении, поэтому new ServiceA() приведет к ошибке, поэтому люди не будут случайно. См. github.com/dotnet/project-system/issues/ < / а> - person Tseng; 26.01.2019
comment
мой корень композиции - это api, где я загружаю плагин (динамически). Теперь этот плагин использует некоторую библиотеку в качестве nuget, как я могу в этой ситуации выполнить регистрацию зависимостей, требуемых библиотекой? - person kuldeep; 23.07.2020