簡體   English   中英

C# - 創建不同類型實例的方法

[英]C# - Method to Create Instances of Different Types

我已經創建了一個方法,作為工廠來推廣我需要的連接類型。 在這種情況下,我可能實例化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;
}

我認為我正處於正確的軌道上,但它似乎非常混亂,並且可能與創建實例所需的實例多余 - connection2RolloutConnectionType創建並返回obj 它有效,但我不喜歡它是如何工作的。 我正在嘗試的是什么? 還有其他途徑可以追求嗎?

假設你想堅持工廠模式,你應該看看如下的東西:

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模型創建一堆邊緣情況。

為什么不讓你的工廠類使用你想要創建的每個東西的靜態方法,並讓每個方法返回它自己的正確的類型轉換對象

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM