C# - 创建不同类型实例的方法

时间:2014-11-26 20:54:00

标签: c# factory

我创建了一个方法,作为工厂来推广我需要的连接类型。在这种情况下,我可能实例化类型SqlConnectionPrincipalContext,并返回该实例。该方法采用单个参数,类型为Object。如果参数值是上面指定的类型,它将创建该对象的实例。我的问题是方法的返回类型是Object,因此在调用方法时需要强制转换。

一个例子是:

SqlConnection connection2 = new SqlConnection();
SqlConnection sqlCon = (SqlConnection)ConnectionFactory.RolloutConnectionType(connection2);

RolloutConnectionType方法:

public static Object RolloutConnectionType(Object obj) {
    if (obj == null) {
        if (obj is PrincipalContext) {//create new PrincipalContext
            string user, pass, domain;
            domain = ConfigurationManager.AppSettings["SAdomain"];
            user = ConfigurationManager.AppSettings["SAuser"];
            pass = ConfigurationManager.AppSettings["SApass"];

            obj = new PrincipalContext(ContextType.Domain, domain + ".mydomain.ca", "CN=MyCN,DC=myDC,DC=ca", user, pass);
        } else if (obj is SqlConnection) {//create new SqlConnection
            string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

            obj = new SqlConnection(connStr);
        }
    }
    return obj;
}

我认为我正处于正确的轨道上,但它似乎非常混乱,并且可能与创建实例所需的实例多余 - connection2来创建并返回obj RolloutConnectionType }}。它有效,但我不喜欢它是如何工作的。我正在尝试的是什么?我还有其他途径吗?

2 个答案:

答案 0 :(得分:2)

假设你想坚持工厂模式,你应该看看如下所示:

public interface Factory<T>
{
    T Create();
}

public class PrincipalContextFactory : IFactory<PrincipalContext>
{
    public PrinicipalContext Create()
    {
        // return new PrincipalContext(...);
    }
}

public class SqlConnectionFactory : IFactory<SqlConnection>
{
    public SqlConnection Create()
    {
        // return new SqlConnection(...);
    }
}

您的工厂不应该只需要返回您所追求的新实例。您可以使用泛型(Create<T>()),但现在您要为不是PrinicpalContextSqlConnection的模型创建一堆边缘情况。

答案 1 :(得分:1)

为什么不让你的工厂类使用你想要创建的每个东西的静态方法,让每个方法都返回自己正确的类型转换对象

public static class YourFactory
{
   public static SqlConnection GetConnection()
   {
      string connStr = System.Configuration.ConfigurationManager
                          .ConnectionStrings["MyConnectionString"].ConnectionString;
      return new SqlConnection(connStr);
   }

   public static PrincipalContext GetPrincipalContext()
   {
        string user, pass, domain;
        domain = ConfigurationManager.AppSettings["SAdomain"];
        user = ConfigurationManager.AppSettings["SAuser"];
        pass = ConfigurationManager.AppSettings["SApass"];

        return new PrincipalContext(ContextType.Domain, domain + ".mydomain.ca",
                 "CN=MyCN,DC=myDC,DC=ca", user, pass);
    }
}