【问题标题】:3-Tier: Sending data across Tiers [closed]3层:跨层发送数据[关闭]
【发布时间】:2014-07-18 17:31:30
【问题描述】:

我有几个与特定产品相关的视觉工作室项目。该产品是 3 层应用程序,例如有数据库、工作流服务器和应用服务器+网络服务。

现在假设这个产品或软件与水果和水果箱的交易有关。我正在做的是,当用户创建或组装水果箱时,我正在创建 FruitCrate 的对象,然后不是使用多个参数调用方法,而是创建 FruitCrate 对象并将其发送到 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 作为示例,这不是我实际在做的事情,因为公司隐私,我无法透露确切的情况。

我想知道的是,有没有更好的方法将对象发送到不同的项目,而不是发送带参数的方法?

请不要与示例混淆。

【问题讨论】:

  • 我建议FruitCrate 应该实现IEnumerable<Fruit>
  • 或者至少有这样的属性。水果的数量只是计数。水果的名称是水果的属性。
  • 或者FruitCrate 可以有一个名为Fruits 的属性,它是IEnumerable<Fruit>,而不是NumberOfFruitsNameOfFruits 属性。
  • 请改进您的标题,使其真正反映您的问题。
  • 这个问题似乎跑题了,因为它属于codereview.stackexchange.com

标签: c# oop 3-tier


【解决方案1】:

从我们看到的小代码中,我认为您应该尝试将问题域分区成一些较小的类,例如:

  • 水果
  • 客户
  • 订购
  • 付款

等等。

然后这些将组合在一个Crate 中,具有更少的属性和其他类的成员。这些其他类应该封装他们的知识和职责。

这种模式称为Composition,是对问题域建模的推荐方法。

不要试图将所有数据放入一个 FruitCrate 类中。

请注意:这个答案是关于你的问题的 OOP 设计方面的。由于您现在已经澄清您的主要关注点是跨层边界的通信,希望这部分问题的一些专家能够加入..!

【讨论】:

  • ...否则你会得到水果沙拉! ;)
【解决方案2】:

好吧,你问这个问题是对的,你做错了。

转到 OO,让我们定义 Fruit 是什么,

public class Fruit
{
    public string Name { get; set; }
}

现在FruitCrateFruit 的集合,我们可以实现的一个简单集合接口是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; }

   // ...
}

【讨论】:

  • 这到底是什么......从集合继承并拥有一个集合?
  • @MareInfinitus,这是个问题吗?
  • 是的,我认为您应该详细说明为什么在您看来拥有一个集合属性是不够的。
  • @MareInfinitus,好吧,因为我的目标是OO,所以我认为水果盒水果的集合。在我看来,水果盒一个集合的观点也是正确的,但不太直观。无论哪种方式,我都不会将水果盒定义为具有固定的编号插槽数组,我的或可能不为空,就像在原始问题中一样。
猜你喜欢
  • 2011-11-27
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多