我创建了一个方法,作为工厂来推广我需要的连接类型。在这种情况下,我可能实例化类型SqlConnection
和PrincipalContext
,并返回该实例。该方法采用单个参数,类型为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
}}。它有效,但我不喜欢它是如何工作的。我正在尝试的是什么?我还有其他途径吗?
答案 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>()
),但现在您要为不是PrinicpalContext
或SqlConnection
的模型创建一堆边缘情况。
答案 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);
}
}