C# 类设计:带有静态工厂和COM对象的公共构造函数或私有构造函数
我有一点关于课堂设计的问题。我将概述我正在考虑的三种模式 示例1:C# 类设计:带有静态工厂和COM对象的公共构造函数或私有构造函数,c#,constructor,C#,Constructor,我有一点关于课堂设计的问题。我将概述我正在考虑的三种模式 示例1: Class MyObject { public MyObject(IWrapper wrapper,string name) {//set properties.} public Void Declare() { //Some COM stuff with IWrapper } } Class MyObject { public MyObject(IWrap
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{//set properties.}
public Void Declare()
{
//Some COM stuff with IWrapper
}
}
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{ //set properties.}
public MyObject Declare()
{
//Some COM stuff with IWrapper
return this;
}
}
使用:
示例2:
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{//set properties.}
public Void Declare()
{
//Some COM stuff with IWrapper
}
}
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{ //set properties.}
public MyObject Declare()
{
//Some COM stuff with IWrapper
return this;
}
}
使用:
示例3:使用私有构造函数
Class MyObject
{
private MyObject(IWrapper wrapper,string name)
{//set properties.}
public static MyObject Declare(IWrapper wrapper,string name)
{
//Some COM stuff with IWrapper
return new MyObject(wrapper,name);
}
}
使用:
我的主要问题是,;
你认为哪种设计更好?隐藏构造函数而使用静态工厂方法是一种不好的做法吗 我也在尽可能地使它可测试。 我无法下定决心的唯一原因是因为MyObject类是COM应用程序中另一个对象的包装器 问题是,这个对象必须在COM应用程序中声明,这是declare方法在调用任何其他方法之前所做的,但是如果我隐藏构造函数,然后向declare方法添加更多的工作,我认为这将使类的其余部分难以测试,因为我必须先通过declare方法
干杯。选项3对我来说似乎是最干净的API。如果在调用Declare之前不能真正使用MyObject,那么对我来说,将new和Declare封装到工厂方法中是有意义的,以确保类的用户在没有首先调用Declare的情况下不会尝试使用MyObject。工厂方法也有助于今后的维护 帮助实现可测试性的一种方法可能是将Declare操作包装在类中的可插入“IDeclarer”接口中。您的生产应用程序将使用调用COM应用程序的IDeclarer实现,而您的测试代码可以插入模拟IDeclarer。可能是这样的(您可能需要调整此…):
MyObject testobj = MyObject.Declare(fakewrapper,"Test");
class MyObject
{
public IDeclarer Declarer { get; set; }
private MyObject(IWrapper wrapper,string name)
{
// set properties
}
public static MyObject Declare(IWrapper wrapper,string name)
{
//Some COM stuff with IWrapper
MyObject newMyObject = new MyObject(wrapper,name);
return Declarer.Declare(newMyObject);
}
}
public interface IDeclarer
{
MyObject Declare(MyObject obj);
}
public class ComDeclarer : IDeclarer
{
public MyObject Declare(MyObject obj)
{
// do COM work
return comObj;
}
}
public class TestDeclarer : IDeclarer
{
public MyObject Declare(MyObject obj)
{
// do nothing... or whatever
return testObj;
}
}