Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类设计:带有静态工厂和COM对象的公共构造函数或私有构造函数_C#_Constructor - Fatal编程技术网

C# 类设计:带有静态工厂和COM对象的公共构造函数或私有构造函数

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

我有一点关于课堂设计的问题。我将概述我正在考虑的三种模式

示例1:

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;
    }
}