Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个类之间共享的列表_C#_.net - Fatal编程技术网

C# 多个类之间共享的列表

C# 多个类之间共享的列表,c#,.net,C#,.net,假设我有一个Invoice类型的列表,我想在多个类之间共享它。遵循单一责任原则,我必须创建三个单独的类来应用我的业务逻辑(我需要在此列表中使用三种方法)。在Main函数中保存实例并将其作为方法参数共享似乎不是一个好主意。我的Main方法开始快速发展,而Invoice类只是我的“域模型类”之一。有什么解决方案可以将这些东西与Main方法分开吗?你们是怎么处理的 public class Invoice { //Model public int Id { get; set; }

假设我有一个Invoice类型的列表,我想在多个类之间共享它。遵循单一责任原则,我必须创建三个单独的类来应用我的业务逻辑(我需要在此
列表中使用三种方法)。在
Main
函数中保存实例并将其作为方法参数共享似乎不是一个好主意。我的
Main
方法开始快速发展,而
Invoice
类只是我的“域模型类”之一。有什么解决方案可以将这些东西与
Main
方法分开吗?你们是怎么处理的

public class Invoice
{
    //Model
    public int Id { get; set; }
    public string DocumentType { get; set; }
    public decimal Amount { get; set; }
}

public class A
{
    public List<Invoice> DoAStuff()
    {
        //extract invoices from xlsx file
        return invoices;
    }
}

public class B
{
    public List<Invoice> DoBStuff(List<Invoice> invoices)
    {
        //Do some operations and update list
        return invoices;
    }
}

public class C
{
    public List<Invoice> DoCStuff(List<Invoice> invoices)
    {
        //Do some operations and update list
        return invoices;
    }
}

public class D
{
    public void DoDStuff(List<Invoice> invoices)
    {
        //Do Something
    }
}
公共类发票
{
//模型
公共int Id{get;set;}
公共字符串DocumentType{get;set;}
公共十进制数{get;set;}
}
公共A类
{
公开名单
{
//从xlsx文件中提取发票
退回发票;
}
}
公共B级
{
公共清单(清单发票)
{
//执行一些操作并更新列表
退回发票;
}
}
公共C类
{
公共清单单据(清单发票)
{
//执行一些操作并更新列表
退回发票;
}
}
D类公共服务
{
公共发票(列出发票)
{
//做点什么
}
}

很明显,如果你的
A
B
C
D
类在需要拆分的地方做了完全不同的事情,或者它们代表了相同的概念,你应该将它们合并为一个类,那么你必须决定它们的职责

对于在所有这些类之间共享相同的
列表
的问题,可以有很多方法,比如包含列表的
静态
类(它将您发送到单例设计模式),或者这些类中只有一个静态列表,但还有另一种方法我最喜欢。您可以将相同的
List
注入这些类的构造函数,甚至让它们继承相同的基类

以下是一个示例:

public abstract class Base
{
    protected List<Invoice> Invoices;

    public Base(List<Invoice> invoices)
    {
        Invoices = invoices;
    }
}


public class A : Base
{
    public List<Invoice> DoAStuff()
    {
        //extract invoices from xlsx file
        return invoices;
    }

    public A(List<Invoice> invoices) : base(invoices)
    {
    }
}


public class B : Base
{
    public List<Invoice> DoBStuff()
    {
        //Do some operations and update list
        return invoices;
    }

    public B(List<Invoice> invoices) : base(invoices)
    {
    }
}


public class C : Base
{
    public List<Invoice> DoCStuff()
    {
        //Do some operations and update list
        return invoices;
    }

    public C(List<Invoice> invoices) : base(invoices)
    {
    }
}

public class D : Base
{
    public void DoDStuff()
    {
        //Do Something
    }

    public D(List<Invoice> invoices) : base(invoices)
    {
    }
}
公共抽象类基类
{
受保护清单发票;
公共基础(列出发票)
{
发票=发票;
}
}
公共A类:基本类
{
公开名单
{
//从xlsx文件中提取发票
退回发票;
}
公共A(发票列表):基础(发票)
{
}
}
B类公共服务:基本服务
{
公共物品清单()
{
//执行一些操作并更新列表
退回发票;
}
公共B(列出发票):基础(发票)
{
}
}
公共C类:基础
{
公开名单
{
//执行一些操作并更新列表
退回发票;
}
公共C(发票列表):基础(发票)
{
}
}
公共D类:基础
{
公共物品
{
//做点什么
}
公共D(发票列表):基础(发票)
{
}
}
大体上你会这样称呼他们:

var invoices = new List<Invoice>();
A a = new A(invoices);
B b = new B(invoices);
C c = new C(invoices);
D d = new D(invoices);
var发票=新列表();
A=新A(发票);
B=新B(发票);
C=新的C(发票);
D=新的D(发票);
您可以看到,您可以访问所有类中的相同列表,因此现在不需要将其作为参数发送给它们


另一方面,我永远不会在应用程序的入口点中放置更多的逻辑,除了组合它的类和调用一个Run方法,该方法将处理应用程序逻辑的其余部分,在那里可以进行单元测试。

您不必为3个不同的方法创建3个不同的类,什么原因?这并不是说单一的责任并不意味着单一的公共方法,而是一种逻辑的东西,比如包括a、B和C的“发票处理”,而不是像用户管理这样不相关的东西。将所有真正的逻辑分离到业务逻辑项目中可能是一个好主意,而主方法只会使用它。BL应处理数据处理,SRP的意思是不混合业务逻辑和主要方法。。。如果说得直截了当(但非常不准确)@Rafacz,我很高兴你发现它很有用!