3-Tier:数据跨层发送
本文关键字:数据 3-Tier | 更新日期: 2023-09-27 18:05:47
我有几个与特定产品相关的视觉工作室项目。该产品是一个三层应用程序,例如数据库,工作流服务器和应用服务器+ web服务。
现在假设这个产品或软件与水果和水果箱的交易有关。我所做的是,当用户创建或组装一个水果箱时,我正在创建一个水果箱的对象,然后不是调用带有几个参数的方法,而是创建水果箱对象并将其发送给DataAccess项目,工作流项目和web服务,而不是参数。
现在让我们输入FruitCrate类或对象,像这样
Public Class FruitCrate
{
Public string NumberOfFruits {get;set;}
Public string NameOfFruits {get;set;}
Public string ClientName{get;set;}
Public string PaymentDetails{get;set;}
.... let say 20 - 30 more properties added
}
现在在dataAccess中,我创建了FruitCrate对象并添加了所有值,如下所示
FruitCrate fc = new FruitCrate();
fc.NameOfFruits = "alksdjaslkdj";
...
fc.PropertyNumber30 = "asdasdasd";
但是当我将这个对象发送到工作流时它是这样的,就像只发送10个属性
FruitCrate fc = new FruitCrate();
fc.NameOfFruits = "alksdjaslkdj";
...
fc.PropertyNumber10 = "asdasdasd";
作为中级开发人员,我不确定这是否是正确的方法?也可以有人建议我任何资源,在那里我可以了解更多关于这种类型的编码,我只是困惑什么搜索来改进这种类型的编码或应用程序架构。
编辑请试着理解我只添加了FruitCrate作为一个例子,这不是我实际在做什么,因为公司隐私我不能透露确切的场景。
我想知道的是,是否有更好的方法跨对象发送到不同的项目,而不是发送方法与参数?
请不要与example混淆
从我们看到的小代码来看,我认为您应该尝试将问题域划分为许多较小的类,如:
- 水果客户
- 为
等。
然后将这些组合在具有更少属性和其他类成员的Crate
中。这些其他类应该封装它们的知识和职责。
此模式称为Composition
,是对问题域建模的推荐方法。
不要尝试将所有数据放入一个FruitCrate类中。
Please note:这个答案是关于你的问题的OOP设计方面的。既然您现在已经澄清了您主要关心的是层边界上的通信,希望这方面的一些专家能够加入进来……!
好吧,你问这个问题是对的,你做错了。
开始,让我们定义什么是Fruit
,
public class Fruit
{
public string Name { get; set; }
}
现在FruitCrate
是Fruit
的集合,我们可以实现的一个简单的集合接口是IReadOnlyList<T>
,所以
public class FruitCrate : IReadOnlyList<Fruit>
{
// Where we will hold the fruit internally.
private readonly List<Fruit> fruits;
// A constructor that takes in some fruit.
public FruitCreate(IEnumerable<Fruit> fruits)
{
this.fruits = fruits.ToList();
}
// The rest is the implementation of IReadOnlyList<T>
public int Count()
{
return this.fruits.Count;
}
Fruit this[int index]
{
get
{
return this.fruits[index];
}
}
IEnumerator<Fruit> GetEnumerator()
{
return this.fruits.GetEnumerator();
}
}
现在,您可以将FruitCrate
视为带有索引器的Fruit
的只读集合。它可以与foreach
这样的迭代器一起工作,并且它有一个Count
属性来告诉你它包含了多少个Fruit
。
然后,将FruitCrate
特定的属性添加到您的类
public class FruitCrate : IReadOnlyList<Fruit>
{
// ...
public string ClientName { get; set; }
public string PaymentDetails { get; set; }
// ...
}