Dependency injection 在.NETCore中将类作为组件实现的正确方法是什么?
我试图在代码中实现一些提供者。现在,提供者可以是不同的类型。例如,提供者可以获取一个url,读取一些xml,并使用给定的解析器作为组件对其进行解析。解析器可以是xml解析器、json解析器或将来的其他解析器。读卡器可以读取给定的url,也可以读取文件,等等 我正在使用.NETCore2.0和依赖注入来实现这一点。到目前为止,我写了下面的代码 设置依赖项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()
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
方法,当您确实想要读取某个内容时,您可以从任意数量的不同来源读取,所有这些来源都具有相同的实例。