在.Net Core中将类实现为组件的正确方法是什么?

时间:2017-12-27 18:54:45

标签: dependency-injection asp.net-core interface components asp.net-core-2.0

我正在尝试在我的代码中实现一些提供程序。现在,提供商可以是不同类型。例如,提供者可以获取URL,读取一些xml并使用给定的解析器作为组件解析它。解析器可以是xml解析器,json解析器或将来的其他解析器。读者可以从给定的URL读取或者可以从文件中读取等等。

我正在使用.net core 2.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 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阅读器,例如文件路径到文件阅读器。并且特定读者可以有其他属性。我怎样才能将它们发送给读者?我确定我做错了但我无法弄清楚我的错误。你能救我吗?

0 个答案:

没有答案