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