C# 如何初始化一个类?
问题很简单,我有一个类“Stock”,我想从数据库中加载它的属性“StockName”,“StockCode” 那么我应该使用哪种模式呢 模式1)使用服务类来创建它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
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是一个抽象工厂模式,没有静态。如果我能帮上忙,我不会有任何静态。