如果我有如下所示的类结构:
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;
}
}
我正在尝试使用 asp.net core MVC 附带的默认 DI 容器来设置 DI 链。但我不明白如何为我的场景进行设置。我是使用 DI 容器的新手,所以我可能会错过一些基本的想法。以下是我尝试设置它的方法(未成功):
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)));
最佳答案
您需要将 Startup.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 注入(inject)到您的 Controller 构造函数中,如下所示:
public ValuesController(IAnimal animal)
{
_animal = animal;
}
关于c# - 如果我的具体类除了其他接口(interface)之外还需要简单的数据类型,如何设置依赖项注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403946/