c# - 如果我的具体类除了其他接口(interface)之外还需要简单的数据类型,如何设置依赖项注入(inject)?

标签 c# .net dependency-injection asp.net-core-mvc

如果我有如下所示的类结构:

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/

相关文章:

c# - 使用带有 MySQL 的 C# Windows 窗体,清理用户数据的最佳方法是什么。

.net - System.AddIn 管道应该安装在哪里?

.net - 在 NHibernate 中映射枚举集合

c# - 依赖注入(inject) : I don't get where to start!

c# - 右侧模糊的 WPF 列表框边框

c# - CA2227 和 ASP.NET 模型绑定(bind)

c# - ValidationMessage 和 ValidationMessageFor 之间的区别

angular - 强制多个组件使用同一个服务实例

asp.net - 通过依赖注入(inject)传递 ASP.NET 用户

c# - 无法批量加载。文件 "csv"不存在或您没有文件访问权限 - Azure