Если у меня есть структура класса, как показано ниже:
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)));
Вы должны изменить свой код в запуске yout.cs к фрагменту ниже.
И просто ввести IAnimal в конструкторе контроллеров, как так: