我有一个应用程序,它使用XML文件来定义一些远程服务器,我希望从那里请求一些文件.

我使用XML文件是因为我可以设置N个服务器和N个要请求的文件,所以我不知道在代码中我将有多少个服务器.

这是我们的密码:

public class Application : IApplication
{
    private readonly List<Requester> _requesters = [];

    public Application(IRequesterFactory paramRequesterFactory)
    {
        _requesters.AddRange(paramRequesterFactory.GetRequesters());
    }



    public RequestFiles()
    {
        foreach(Requester requester in _requesters)
        {
            _requsters.RequestFiles();
        }
    }
}


public class RequesterFactory
{
    private readonly ICongigurationManager _configurationManager;


    public RequesterFactory(IConfigurationManager paramConfigurationManager)
    {
        _configurationManager = paramConfigurationManager;
    }



    public List<Requester> CreateRequesters()
    {
        //Create requesters from the information getted from the configuration XML file using cofiguration manager.
    }
}

但是我怀疑在类中注入一个工厂,这样这个类就可以得到它所需要的请求者是否是一个好主意.

depedency injection,如果我没猜错的话,它是用来避免self类创建它工作所需的资源的.

但是,通过这种方式,它使用了一个作为接口传递的工厂,所以我可以传递任何其他实现,我可以测试这个类,这是IoC的好处之一.

理论上,这个类似乎正在创建它所需要的对象,但是我如何使用和接口作为工厂,我认为我正在利用依赖注入的好处.

所以我的问题是,把一个工厂注入一个班级是不是一个好的做法,我做得怎么样?如何使用依赖注入来创建N个对象,这些对象可以是不同的,或者通过XML文件修改?

谢谢.

推荐答案

从理论上讲,类似乎正在创建它需要的对象,

不完全是,它要求另一个工厂(工厂)来创建它们,你可以在composition root层上决定具体的工厂.

你正在使用的factory pattern是一个众所周知的,它与DI非常好地配对.框架提供的基础设施也包括一些工厂.比如EF Core的IHttpClientFactoryIDbContextFactory.

根据实际的应用程序,你可能也想考虑通过界面抽象Requester:

interface IRequesterFactory
{
    public IReadOnlyCollection<IRequester> CreateRequesters();
}

注:工厂方法通常被设计成DI容器不控制工厂创建的对象的生存期,所以如果它应该被释放,那么你需要"手动"来处理(参见DbContext和HTTP工厂示例),尽管它并不总是这样,所以有时会导致leaky abstraction.

Csharp相关问答推荐

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

C#将参数传递给具有变化引用的变量

C#使用属性和值将JSON转换为XML

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

SignalR客户端不会打印队列位置'

图形API基于appid列表检索多个应用程序

Blazor EventCallback<;MyType<;T>;>;

查找表中的模式

用C#从Word文档中删除重复的节控件和文本内容控件

如何使用MoQ模拟Resources GroupCollection?

如何让NLog停止写入冗余信息?

如何使用.NET6WPF打印车票?

ASP.NET Core MVC将值从视图传递到控制器时出现问题

是否可以将Collectionview中的数组与ObservableCollection绑定?

Content WithTargetPath实际上是有效的MSBuild项吗?

如何在发布NuGet包之前设置命名空间?

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

如何在Xamarin.Forms中检索PanGesture事件的位置?