Dependency injection 在.NETCore中将类作为组件实现的正确方法是什么?

Dependency injection 在.NETCore中将类作为组件实现的正确方法是什么?,dependency-injection,asp.net-core,interface,components,asp.net-core-2.0,Dependency Injection,Asp.net Core,Interface,Components,Asp.net Core 2.0,我试图在代码中实现一些提供者。现在,提供者可以是不同的类型。例如,提供者可以获取一个url,读取一些xml,并使用给定的解析器作为组件对其进行解析。解析器可以是xml解析器、json解析器或将来的其他解析器。读卡器可以读取给定的url,也可以读取文件,等等 我正在使用.NETCore2.0和依赖注入来实现这一点。到目前为止,我写了下面的代码 设置依赖项 var serviceProvider = new ServiceCollection() .AddLogging()

我试图在代码中实现一些提供者。现在,提供者可以是不同的类型。例如,提供者可以获取一个url,读取一些xml,并使用给定的解析器作为组件对其进行解析。解析器可以是xml解析器、json解析器或将来的其他解析器。读卡器可以读取给定的url,也可以读取文件,等等

我正在使用.NETCore2.0和依赖注入来实现这一点。到目前为止,我写了下面的代码

设置依赖项

    var serviceProvider = new ServiceCollection()
        .AddLogging()
        .AddSingleton<App>()
        .AddSingleton<IProviderService, ProviderService>()
        .AddScoped<IFileReader, FileReader>()
        .AddScoped<IWebReader, WebReader>()
        .BuildServiceProvider();
public class Provider: IProvider
{
    private IReader reader;

    public Provider(IReader reader)
    {
        this.reader = reader;
    }

    public string Start()
    {
        return reader.Read();
    }
}
提供商服务

    public class ProviderService : IProviderService
    {
        private readonly IWebReader webReader;
        private readonly IFileReader fileReader;

        public ProviderService(IWebReader webReader, IFileReader fileReader)
        {
            this.webReader = webReader;
            this.fileReader = fileReader;
        }

        public List<IProvider> GetProviders()
        {
            return new List<IProvider>() {
                new Provider(webReader),
                new Provider(fileReader),
                new Provider(webReader)
            };
        }
    }
    public interface IReader
    {
        string Read();
    }
文件读取器

    public interface IFileReader : IReader
    {}

    public class FileReader : IFileReader
    {
        public string Read()
        {
            return "Got data from file (txt)";
        }
    }
    public interface IWebReader : IReader
    {}

    public class WebReader : IWebReader
    {
        public string Read()
        {
            return "Got data from web (www)";
        }
    }
网络阅读器

    public interface IFileReader : IReader
    {}

    public class FileReader : IFileReader
    {
        public string Read()
        {
            return "Got data from file (txt)";
        }
    }
    public interface IWebReader : IReader
    {}

    public class WebReader : IWebReader
    {
        public string Read()
        {
            return "Got data from web (www)";
        }
    }
应用程序

    public class App
    {
        private readonly IProviderService providerService;

        public App(IProviderService providerService)
        {
            this.providerService = providerService;
        }

        public void Start()
        {
            var providerList = providerService.GetProviders();

            providerList.ForEach((provider) =>
            {
                Console.WriteLine(provider.Start());
            });

            Console.ReadLine();
        }
    }

现在我可以在提供程序中更改读取器,并且我将以与上面在读取器中相同的方式实现解析器。但是,我需要将url传递给web阅读器,例如,将文件路径传递给文件阅读器。对于特定的读卡器,还可以有其他属性。我怎样才能将它们发送给读者?我肯定我做错了什么,但我不知道我的错误。你能帮我吗?

我不确定我是否完全理解你的问题,因为答案似乎很明显。当然,您会将filepath/URL作为参数传递给
Read
方法。谢谢您的回答,我想,但是如果您看看我的提供者服务,读者是通过注入提供的。所以我不能用构造函数参数调用它们。或者我不应该通过注入来提供它们?这正是为什么它应该作为参数传递给
Read
。该类可以读取任何源代码,因此将源代码作为构造的一部分是错误的,因为现在您将其限制在一个非常狭窄的用法中。相反,通过传递到
Read
方法,当您确实想要读取某个内容时,您可以从任意数量的不同来源读取,所有这些来源都具有相同的实例。