2010-07-12 36 views
1

我有需要“年”作为参数的DataProvider类(DAL)。它使用像这样:异常可抛出的构造函数和初始化。最佳做法

using (var provider = new DataProvider(year)) 
{ 
    provider.SomeRepostitory.DoSomethingUsefull(); 
} 

DataProvider构造函数代码处理配置 - 因此它可以抛出异常。不推荐使用异常抛出构造函数。所以我添加初始化方法,并把那里所有抛出代码:

var provider = new DataProvider(); 
provider.Init(year); 

但是现在有两行代码中的一个,而不是和供应商在整个代码中创建了很多次,我就把这两条线织成织物的静态方法:

using (var provider = DataProvider.Create(year)) 
{ 
    ... 
} 

是好的还是有更好的解决方案?

预先感谢您!

回答

4

DataProvider构造函数代码使用配置处理 - 因此它可以抛出 异常。建议不要使用异常抛出的 构造函数。

他们为什么“不推荐”?看看微软的基类库,你会发现每个单独的构造函数都会检查传递给它的参数,并且如果参数无效则抛出某种类型的参数异常。为什么你会让某人在没有告诉他们的情况下实例化一个处于无效状态的对象?提前失败,努力失败。

抛出一个异常的构造函数是一个更好的API来编程,而不是必须使用单独的初始化方法(我个人很讨厌两阶段初始化;很容易忘记第二次调用)。除非有一个令人信服的理由来避免它,否则我只是在构造函数中进行检查。

如果您确实想使用静态工厂方法(除非需要使其松散耦合,否则没有任何问题),请确保默认构造函数是私有的,以便用户被迫使用适当的工厂方法。

2

我认为有一个工厂方法对对象进行一些初始化是完全合理的。如果您不应该在没有初始化的情况下使用对象,请将构造函数设置为private(或protected),以便只有类中的静态方法才能调用构造函数。

0

如果您想将呼叫链接在一起,您可以使用Init方法返回this。像:

var provider = new DataProvider().Init(year); 

但如果你打电话.Init(),那么工厂方法款式可能会更有帮助。

0

你可以逃脱懒惰的实例吗?在创建它的年份传递,但在使用之前不要实际初始化它。这会把例外移到第一个电话而不是建筑物,但它似乎符合你的要求。

+0

这意味着每次使用“worker”方法时都必须捕获潜在的异常,尽管这可能是相当大的开销。这也意味着对该方法的第一次调用不如其余,这与良好的API设计相反, – 2010-07-12 21:00:04