gpt4 book ai didi

c# - 根据参数使用不同依赖项时的依赖策略

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:04 25 4
gpt4 key购买 nike

有这个界面:

public interface FileManager {
string UploadFile(HttpPostedFileBase file);
string UploadFile(Uri uri);
}

我的实现看起来像:

public class FileManagerAzure : FileManager {
private FileParser parser;
FileManagerAzure(FileParser parser){
this.parser = parser; // Can this be a constructor injection??
}

public string UploadFile(HttpPostedFileBase file) {
return parser.Parse(file); // Should I Inject the parser here depending on type ??
}
public string UploadFile(Uri uri) {
return parser.Parse(uri);
}
}

这对 FileParser 有依赖性,如下所示:

public interface FileParser {
string Parse(object source)
}

理想情况下,我希望有一些解析器实现(这当然行不通):

public class FileParserHttpPostedFileBase : FileParser {
string Parse(HttpPostedFileBase source) {
return file.FileName;
}
}

public class FileParserUri : FileParser {
string Parse(Uri source) {
return Uri.ToString();
}
}
  1. 是否可以根据传递给 UploadFile() 的参数创建具体的解析器依赖项?这一定是二传手注入(inject)?这好吗,或者我可以遵循任何其他策略吗?

  2. 我必须让我的 FileParser 接口(interface)接收一个对象作为源。这听起来不应该,因为我有一组有限的允许输入类型,当然不是 object。在本例中为 HttpPostedFileBaseUri。我怎样才能限制这个范围?

最佳答案

您可以通过构造函数注入(inject)依赖项。这是我尽可能选择的方式。不过,这意味着您不能使用 IoC 容器进行实例化。您可以使用抽象工厂模式来封装注入(inject)具体解析器的决策,并让 IoC 容器将具体工厂注入(inject)调用类。

不过,这似乎有点矫枉过正。由于您的 FileManager 接口(interface)公开了两种参数类型的方法,为什么不注入(inject)两种解析器类型?为此,我会将 FileParser 类型设为通用类型,这样您就不需要为每个新解析器创建一个新接口(interface)。

public interface FileParser<T>
{
string Parse(T value);
}

public class UriParser : FileParser<Uri>
{
string Parse(Uri value)
{
// implementation
}
}

然后您可以像这样实现 FileManagerAzure:

public class FileManagerAzure : FileManager {
private FileParser<Uri> uriParser;
private FileParser<HttpPostedFileBase> postedFileParser;
FileManagerAzure(FileParser<Uri> uriParser, FileParser<HttpPostedFileBase> postedFileParser){
this.uriParser = uriParser;
this.postedFileParser = postedFileParser;
}

public string UploadFile(HttpPostedFileBase file) {
return this.postedFileParser.Parse(file);
}
public string UploadFile(Uri uri) {
return this.uriParser.Parse(uri);
}
}

这个实现也可以由 IoC 容器实例化,没问题。

关于c# - 根据参数使用不同依赖项时的依赖策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com