C# 如何初始化一个类?

C# 如何初始化一个类?,c#,class,initialization,C#,Class,Initialization,问题很简单,我有一个类“Stock”,我想从数据库中加载它的属性“StockName”,“StockCode” 那么我应该使用哪种模式呢 模式1)使用服务类来创建它 public interface IStockService{ Stock GetStock(string stockCode); void SaveStock(Stock stock); } public class StockServic

问题很简单,我有一个类“Stock”,我想从数据库中加载它的属性“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:似乎它使用了太多的代码来创建一个stock对象,“SaveStock”方法似乎有点不面向对象。
对于模式2,“Save”方法似乎可以,但GetStock方法是一个静态方法,它似乎是一个始终使用静态方法的实用程序类。

对于模式3:构造函数将在初始化时从db加载数据。这看起来也很混乱。

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

我个人喜欢我的objects是从他们的数据源中抽象出来的,所以我会选择像#1。#3这样的方法。你肯定不想做……构造函数中太多的处理会给你带来麻烦。#1 vs#2的偏好可能归结为你希望数据对象如何“加载”


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

我将使用模式1。它在域模型和数据访问之间提供了一个清晰的关注点分离。它也更容易进行单元测试。

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

模式2)是工厂(方法)模式,让我想起了单例(static=singleton)。注意,工厂方法不是多态的。你不能为测试更改它(即,你不能模拟它)。这是邪恶的!避免它

模式3)违反了构造函数不应该做太多的工作。在我看来,查询数据库对于一个ctor来说太多了。对象和它的创建是不同的关注点,应该分开。更多的实例创建应该与实例分开,所以试着使用工厂(或注入器)。替换工厂比替换贯穿代码的“新类”更容易

模式1)保留,这是一个抽象工厂模式。它很好。您可以使用另一个实现进行测试(模拟)。它将创建与对象分离。(卡尔·贝奎斯特称之为单一责任原则。)


因此,我将使用模式1。

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

您缺少一个重要的部分。具体来说,您从哪里获得与数据库对话的连接字符串

用连接字符串的来源更新每个示例,我认为这将使正确的答案弹出。

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

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

模式3:
-对于小类来说是可以的。但是不要让构造函数使用逻辑


但我认为Orm和序列化涵盖了大部分内容(对象创建).

工厂模式通常使用静态方法。在这里的实例1中,初始化类只是为了允许它使用接口。没有类变量,因此可以很容易地重写为静态。IStockService是一个抽象工厂模式,没有静态。如果我能帮上忙,我不会有任何静态。