难以理解类和属性

本文关键字:属性 | 更新日期: 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");