Как настроить инъекцию зависимостей, если моему конкретному классу требуется простой тип данных в дополнение к другим интерфейсам?

Если у меня есть структура класса, как показано ниже:

public interface IDataProvider
{
    object GetSomeData(int id);
}

public class InMemoryDataProvider : IDataProvider
{
    public InMemoryDataProvider(string connString)
    {

    }

    public object GetSomeData(int id)
    {
        return new object();
    }
}

public interface IAnimal
{
    string GetName();
}

public class Dog: IAnimal
{
    public Dog(string someRequiredInfo, IDataProvider someDataProvider)
    {

    }
    public string GetName()
    {
        return string.Empty;
    }
}

Я пытаюсь настроить цепочку DI, используя контейнер DI по умолчанию, который поставляется с asp.net core MVC. Но я не понимаю, как настроить мой сценарий. Я новичок в использовании DI container, поэтому я могу пропустить какую-то фундаментальную идею.Ниже, как я пытался настроить его (безуспешно):

string connString = "connectionString";
someString = "some required info";
AddSingleton<IDataProvider, InMemoryDataProvider>(x => new InMemoryDataProvider(connString));
AddTransient<IAnimal, Dog>(); //if I do this, how will it get the first parameter of someString? Don't think this will even work.
AddTransient<IAnimal, Dog>(x => new Dog(someString, IDataProvider???)) //how to do this?

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

services.AddTransient<IAnimal, Dog>(x => new Dog(someString, new InMemoryDataProvider(connString))); 

1 ответ

  1. Вы должны изменить свой код в запуске yout.cs к фрагменту ниже.

    public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                services.AddApplicationInsightsTelemetry(Configuration);
    
                services.AddSingleton(x => new InMemoryDataProvider(connString));
                services.AddSingleton<IDataProvider, InMemoryDataProvider>(x => x.GetService<InMemoryDataProvider>());
                services.AddSingleton<IAnimal, Dog>(d=> new Dog(someString, d.GetService<IDataProvider>()));
    
                services.AddMvc();
            }
    

    И просто ввести IAnimal в конструкторе контроллеров, как так:

    public ValuesController(IAnimal animal)
            {
                _animal = animal;          
            }