难以理解类和属性
本文关键字:属性 | 更新日期: 2023-09-27 18:32:55
虽然我知道这是一个简单的问题,也是我知识上的差距 - 请记住,我正在编写此代码来学习(详细的解释或最佳实践建议将对此有很大帮助)。
首先,这是我的班级:
namespace CCQ.Crawler._2010
{
public class MSSQL
{
public MSSQL(string connectionString)
{
ConnectionString = connectionString;
}
public static string ConnectionString { get; private set; }
/// <summary>
/// Class to house statements that insert or update data into the database
/// </summary>
public class Upserts
{
/// <summary>
/// Add or update a new entry on the site collection table
/// </summary>
/// <param name="siteCollectionName"></param>
public void SiteCollection(string siteCollectionName)
{
const string queryString =
@"INSERT INTO [dbo].[SiteCollections]
([SnapShotDate]
,[SiteCollectionName]
,[SiteWebCount]
,[ContentDatabase]
,[SiteWebApplication])
VALUES
(@snapShotDate, @siteCollectionName, @siteWebCount, @contentDatabase, @siteWebApplication)";
using (var connection = new SqlConnection(ConnectionString))
{
using (var cmd = new SqlCommand(queryString, connection))
{
connection.Open();
cmd.Parameters.AddWithValue("snapShotDate", DateTime.Today.Date);
cmd.Parameters.AddWithValue("siteCollectionName", siteCollectionName);
cmd.ExecuteNonQuery();
}
}
}
}
}
}
这是我的主程序文件:
namespace CCQ.Crawler._2010
{
internal class Program
{
private static string _connectionString;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public static string ConnectionString
{
get
{
if (string.IsNullOrEmpty(_connectionString))
{
_connectionString = AES.DecryptFromBase64String(ConfigurationManager.AppSettings["DatastoreConnection"]);
}
return _connectionString;
}
}
static void Main(string[] args)
{
string version = Assembly.GetAssembly(typeof(Program)).GetName().Version.ToString();
Console.WriteLine("[{0}] SharePoint Crawler started with version '{1}'.", DateTime.Now.ToShortTimeString(), version);
Logger.Info(string.Format("[{0}] SharePoint Crawler started with version '{1}'.", DateTime.Now.ToShortTimeString(), version));
try
{
var query = new MSSQL(ConnectionString);
}
catch (Exception ex)
{
Logger.Error(String.Format("[{0}] {1}", DateTime.Now.ToShortTimeString(), ex.GetBaseException()));
Console.WriteLine("[{0}] {1}", DateTime.Now.ToShortTimeString(), ex.GetBaseException());
}
}
}
}
现在我想我可以用这门课做的是:
var query = new MSSQL(ConnectionString).Upserts;
query.SiteCollection("testing");
但是,好吧,这行不通。当我尝试声明类时,我遇到的错误是:
此时类名无效
我知道我的知识/班级建设存在巨大差距,这就是为什么,但我不知道从哪里开始——我的想法错误在哪里?
在以下代码行中:
var query = new MSSQL(ConnectionString).Upserts;
您实际上是在构造 MSSQL 类的新实例,然后使用该语法,就好像Upserts
是您尝试访问的属性一样。
相反,要实例化嵌套类,您应该执行以下操作:
var mssql = new MSSQL("your connection string");
var query = new MSSQL.Upserts();
但。。。
在封闭类的静态属性中存储连接字符串的方式有点奇怪,在非静态构造函数中初始化静态属性也很奇怪。
您可能不需要Upserts
嵌套类。请尝试将其设置为一种方法。
此外,连接字符串可以存储在实例字段/属性中,而不是静态的。
'query' 的类型是 MSSQL。 "网站集"属性属于"更新插入"类型。 尽管您已将 MSSQL 中的更新插入类型定义为嵌套类型,但实际上并没有在 MSSQL 对象中使用更新插入类型(例如,作为属性)。
我可以看到启动并运行它的最快方法是将 Upserts 属性添加到 MSSQL 类并在构造函数中实例化它。
public Upserts Upserts { get; private set; }
然后,您将能够通过以下方式访问该方法:
query.Upserts.SiteCollection("...");
或者,您可以修改 Upserts 以接收连接字符串并直接实例化它......不过,这是从等式中删除MSSQL的一步。
我知道你写这篇文章是为了把你的头缠在类和属性上,所以我不会评论这是否是 DAL 的好方法。
我认为在这种情况下没有必要使用嵌套类。你可以试试这个:
/// <summary>
/// <para>MSSQL class</para>
/// </summary>
public class MSSQL
{
#region Class field declaration
private string f_connectionString;
#endregion
#region Public method
/// <summary>
/// <para>Static method for getting the class instance.</para>
/// </summary>
/// <param name="p_connectionString">MSSQL connection string</param>
/// <returns><see cref="MSSQL"/></returns>
public static MSSQL Create(string p_connectionString)
{
return new MSSQL(p_connectionString);
}
public void SiteCollection(string p_siteCollectionName)
{
//Your Logic here.
}
#endregion
#region Constructor
/// <summary>
/// <para>Hide the default constructor</para>
/// </summary>
private MSSQL()
{
}
/// <summary>
/// <para>Private constructor for Static method</para>
/// </summary>
/// <param name="p_connectionString">MSSQL connection string</param>
private MSSQL(string p_connectionString)
{
this.f_connectionString = p_connectionString;
}
#endregion
}
通过此代码,您可以通过以下方式创建此类的实例:
var instance = MSSQL.Create("ConnectionString");
通过以下方式获取网站集:
var siteCollection = instance.SiteCollection("Testing");