C#-创建不同类型实例的方法
我已经创建了一个方法,作为一个工厂来推出我需要的连接类型。在本例中,我可能正在实例化类型C#-创建不同类型实例的方法,c#,factory,C#,Factory,我已经创建了一个方法,作为一个工厂来推出我需要的连接类型。在本例中,我可能正在实例化类型SqlConnection和PrincipalContext,并返回该实例。该方法只接受一个参数,类型为Object。如果参数值为上述指定类型,它将创建该对象的实例。我的问题是该方法的返回类型是对象,因此调用该方法时需要强制转换 例如: SqlConnection connection2 = new SqlConnection(); SqlConnection sqlCon = (SqlConnection)
SqlConnection
和PrincipalContext
,并返回该实例。该方法只接受一个参数,类型为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
在RolloutConnectionType
中创建并返回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(...);
}
}
公共接口工厂
{
T Create();
}
公共类PrincipalContextFactory:IFactory
{
公共PrinicipalContext创建()
{
//返回新的PrincipalContext(…);
}
}
公共类SqlConnectionFactory:IFactory
{
公共SqlConnection创建()
{
//返回新的SqlConnection(…);
}
}
你的工厂只需要返回一个新的实例就可以了。您可以使用泛型(
Create()
),但现在您正在为模型创建一系列边缘案例,而不是PrinicpalContext
或SqlConnection
为什么不让您的factory类包含您试图创建的每个对象的静态方法,并让每个方法返回自己的正确类型转换对象
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);
}
}
那么,您正在向工厂方法传递一个实例,然后将其重新定义为一个新实例?听起来不再像工厂了……为什么不让两个重载直接接受不同的类型并相应地返回这些类型呢?不需要演员阵容。@BradChristie承认这是相当混乱的。更重要的是,如果沿着这条路线做一些事情是可能的。我在OP中发布的更多的是一个示例,而不是我在现实生活中使用的东西。这实际上是我已经实现的,但我希望将它们合并到一个roll-out方法中。显然,我们不能有多个返回类型,
SqlConnection
和PrincipalContext
,因此返回类型是Object
。这可能吗?或者推荐信会坚持你上面的建议吗?@DrewKennedy:不能两全其美。您可以使用对象
并强制转换它,或者使用严格类型的方法(尽管是返回类型或使用泛型)。@bradcristie ah好的。我希望有一些忍者的方式来做这件事,我可能忽略了。我感谢你的反馈。你的答案本身并没有错,所以我给你一个答案。@DrewKennedy说得清楚,如果你拥有这个对象,你可以实现你自己的隐式
/显式
强制转换操作符并强制转换它,但这不是很优雅。这实际上非常有用,并带来了一些新的可能性。谢谢更喜欢你的版本:)@DRapp:can实现YourFactory:IFactory,IFactory
;-)