如何初始化一个类?

时间:2009-10-22 06:56:43

标签: c# class initialization

问题很简单,我有一个类“Stock”,我想从db中加载它的属性“StockName”,“StockCode”。

我应该使用哪种模式?

模式1)使用服务类创建它


 public interface IStockService{
             Stock GetStock(string stockCode);
             void SaveStock(Stock stock);
         }
         public class StockService : IStockService{
         }

         IStockService stockService = new StockService();
         Stock stock = stockService.GetStock();

模式2)在库存中使用静态方法


        public class Stock{
            public static Stock GetStock(){
                Stock stock = new Stock;
                //load stock from db and do mapping.
                return stock;
            }
            public void Save(){
            }
        } 

模式3)使用构造函数加载

        public class Stock{
            public Stock(){
                //load stock from db and do mapping.
                this.stockName = ...
                this.stockCode = ...
            }
        }

对于模式1:它似乎使用如此多的代码来创建一个库存对象,而“SaveStock”方法似乎有点不是面向对象的。
对于模式2:“保存”方法似乎没问题,但GetStock方法是一个静态方法,它似乎是一个总是使用静态方法的Utility类。
对于模式3:构造函数将在初始化时从db加载数据。它似乎也很困惑。

8 个答案:

答案 0 :(得分:5)

模式2)是工厂(方法)模式并让我想起单身人士(静态=单身人士)。注意singletons are evil。工厂方法不是多态的。您不能为测试更改它(即您无法模拟它)。这是邪恶的!避免它!

模式3)违反了构造函数不应该做太多的事情。在我看来,查询数据库对于ctor来说太过分了。对象及其创建是不同的关注点,应该分开。应该将实例的更多创建与实例分开,因此尝试使用工厂(或注入器)。您可以比代码中的“新类”更容易替换工厂。

模式1)仍然存在,这是一个抽象的工厂模式。这很好。您可以使用另一个实现进行测试(模拟)。它将创建与对象分开。 (Carl Bergquist称之为单一责任原则。)

所以我会选择模式1。

答案 1 :(得分:2)

模式1:
- 更容易测试
- 单一责任原则
- 可能需要更多代码。

模式2:
- 静态类/方法可以使模拟更加困难。我尽可能地避免它。

模式3:
- 适合小班教学。但要保持逻辑远离构造函数

但我认为Orm和序列化涵盖了大多数部分(对象创建)。

答案 2 :(得分:1)

你错过了一件重要的作品。具体来说,您在哪里获得用于与数据库通信的连接字符串?

更新每个示例以及连接字符串的来源,我认为它会弹出正确的答案。

答案 3 :(得分:0)

类似于方法1,您应该调用DB层类来从那里加载对象,尽管您可能希望使用ORM来处理所有数据访问

答案 4 :(得分:0)

就个人而言,我喜欢从数据源中抽象出我的对象,所以我会选择像#1这样的方法。 #3你肯定不想这样做......构造函数中的太多处理会让你陷入困境。 #1 vs#2的偏好可能归结为您希望数据对象“加载”的程度。

如果您预见到从另一个数据源获取对象,您将希望坚持使用#1,因为它提供了更好的灵活性。

答案 5 :(得分:0)

我会使用模式1.它明确区分了域模型和数据访问之间的关注点。单元测试也更容易。

答案 6 :(得分:0)

如果你想自动初始化它,那么使用由类加载器.net服务调用的静态构造函数。

答案 7 :(得分:0)

你应该分离实体类(stock)和填充它的逻辑(stockservice),但是不要编写stockservice类,只需使用orm将db映射到你的实体类(stock)。