0

私のコードには 3 つのセクションがありますが、3 つのセクションのうち 2 つのコードはほとんど同じです。両方のセクションで表示されるので、それほど多くのコードは必要ありません。(フレームワーク 3.5)

public static void FakeDriveInfo()
{
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>();

    Server server = new Server();

    Console.WriteLine();
    Console.ForegroundColor = ConsoleColor.White;
    Console.WriteLine("Server ID :      {0}", server.ServerID = 0);
    Console.WriteLine("Server Name :    {0}", server.ServerName = string.Concat(System.Environment.MachineName));
    Console.WriteLine();

    for (int i = 0; i < driveList.Count; i++)
    {
        ServerDrive serverDrives = new ServerDrive();

        Console.WriteLine("Drive Letter:    {0}", driveList[i].Name);
        Console.WriteLine("Total Size:      {0}", FormatBytes(driveList[i].TotalSize));
        Console.WriteLine("Volume Label:    {0}", driveList[i].VolumeLabel);
        Console.WriteLine("Free Space:      {0}", FormatBytes(driveList[i].TotalFreeSpace));
        Console.WriteLine("Drive Format:    {0}", driveList[i].DriveFormat);
        Console.ReadLine();
    }
}

public static void RealDriveInfo()
{
    //Create the server object - You will need create a list of the server objects.
    Server server = new Server();

    //Get all drives information
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>();

    //Insert information of one server - You will need get information of all servers
    server.ServerID = 0; //Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK.
    server.ServerName = string.Concat(System.Environment.MachineName);

    //Inserts information in the newServers object
    for (int i = 0; i < driveList.Count; i++)
    {
        ServerDrive serverDrives = new ServerDrive();

        //Put here all the information to obeject Server                
        serverDrives.DriveLetter = driveList[i].Name;
        serverDrives.TotalSpace = driveList[i].TotalSize;
        serverDrives.DriveLabel = driveList[i].VolumeLabel;
        serverDrives.FreeSpace = driveList[i].TotalFreeSpace;
        serverDrives.DriveType = driveList[i].DriveFormat;

        //      server.ListServerDrives.Add(serverDrives);
        server.ServerDrives.Add(serverDrives);
    }

    //Add the information to an SQL Database using Linq.
    DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver");
    //   db.Servers.InsertAllOnSubmit(server);
    db.Servers.InsertOnSubmit(server);
    db.SubmitChanges();
}

私がやりたいことは、コードの下部にある SQL to Linq 部分を独自のセクションに移動することです。しかし、それを行うには、RealDriveInfoセクション全体も必要です..

私がやりたいもう 1 つの部分はList<DriveInfo> driveList = DriveInfo.GetDrives().Where(x=>x.IsReady).ToList<DriveInfo>();、FakeDriveInfo と RealDriveInfo で見られるようにすることです。

どんなフィードバックでも大歓迎です、ありがとう。

編集: 現時点では、FakeDriveInfo(); の 2 つのメソッドを呼び出しています。= コンソール アプリを実行し、送信する情報を表示します。名前、文字、ラベル、サーバー名、ID など。= SQL Server に接続し、2 つのテーブルに情報を挿入します。

3 つ目のメソッド WriteInToDB(); が必要です。= DB 書き込みコードは RealDriveInfo メソッドから取得され、代わりにここに移動されます。

現時点では、スコープのために実質的に同一に見える 2 つのメソッドがあります。コードの List 部分を Main() メソッドに配置できるようにスコープをシフトし、FakeDriveInfo と RealDriveInfo の両方がコードを複製する代わりにそこから使用できるようにします。

うまくいけば、これはすべてにもう少し意味を追加します:)

4

4 に答える 4

1

ProcessDriveInfo2 つの元のメソッドによって呼び出される新しいメソッドを作成するアプローチを採用しました。これら 2 つのメソッドは、ドライブのリストをフェッチし、サーバーを作成し、サーバーで何かを行い、各ドライブに対して何かを行いました。最初の 2 つのステップを に移動しProcessDriveInfo、最後の 2 つのステップのアクションを渡しました。

最初のアクション (つまりメソッド) はサーバーに対して何かを行い、2 番目のアクションは単一の に対して何かを行いますdriveInfo

nb重複を削除するという点で質問に「答え」ましたが、読みにくいと主張できます。

    public Server ProcessDriveInfo(Action<Server> initialAction, Action<Server, DriveInfo> driveInfoAction)
    {
        var driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList();
        var server = new Server();

        initialAction(server);
        driveList.ForEach(dl => driveInfoAction(server, dl));

        return server;
    }

    public void FakeDriveInfo()
    {
        ProcessDriveInfo(WriteServerToConsole, WriteDriveInfoToConsole);
    }

    private void WriteServerToConsole(Server server)
    {
        Console.WriteLine();
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Server ID :      {0}", server.ServerID = 0);
        Console.WriteLine("Server Name :    {0}", server.ServerName = string.Concat(System.Environment.MachineName));
        Console.WriteLine();
    }

    private void WriteDriveInfoToConsole(Server server, DriveInfo t)
    {
        Console.WriteLine("Drive Letter:    {0}", t.Name);
        Console.WriteLine("Total Size:      {0}", FormatBytes(t.TotalSize));
        Console.WriteLine("Volume Label:    {0}", t.VolumeLabel);
        Console.WriteLine("Free Space:      {0}", FormatBytes(t.TotalFreeSpace));
        Console.WriteLine("Drive Format:    {0}", t.DriveFormat);
        Console.ReadLine();
    }

    public void RealDriveInfo()
    {
        var server = ProcessDriveInfo(InitialiseServer, WriteDriveInfoToServer);

        //Add the information to an SQL Database using Linq.
        var db = new DataClasses1DataContext(@"sqlserver");
        //   db.Servers.InsertAllOnSubmit(server);
        db.Servers.InsertOnSubmit(server);
        db.SubmitChanges();
    }

    private static void InitialiseServer(Server server)
    {
        // Insert information of one server - You will need get information of all servers
        server.ServerID = 0;
        // Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK.
        server.ServerName = Environment.MachineName;
    }

    private static void WriteDriveInfoToServer(Server server, DriveInfo t)
    {
        var serverDrives = new ServerDrive
                               {
                                   DriveLetter = t.Name,
                                   TotalSpace = t.TotalSize,
                                   DriveLabel = t.VolumeLabel,
                                   FreeSpace = t.TotalFreeSpace,
                                   DriveType = t.DriveFormat
                               };

        server.ServerDrives.Add(serverDrives);
    }
于 2012-08-07T13:39:21.580 に答える
1

機能を正しくキャプチャできたことを願っています。3 つの領域、作成、出力、永続化。もちろん、各セクションを取り、再利用可能なメソッドを作成できます。出力セクションを のToString()メソッドに移動できServerます。

        #region create graph

        var server = new Server()
        {
            ServerID = 0,
            ServerName = string.Concat(Environment.MachineName),
            ServerDrives = DriveInfo.GetDrives()
                                    .Where(x => x.IsReady)
                                    .Select(di => new ServerDrive()
                                    {
                                        DriveLetter = di.Name,
                                        TotalSpace = di.TotalSize,
                                        DriveLabel = di.VolumeLabel,
                                        FreeSpace = di.TotalFreeSpace,
                                        DriveType = di.DriveFormat
                                    })
                                    .ToList()
        };

        #endregion

        #region output graph

        Console.WriteLine();
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Server ID :      {0}", server.ServerID);
        Console.WriteLine("Server Name :    {0}", server.ServerName);
        Console.WriteLine();

        server.ServerDrives.ForEach(sd =>
        {
            Console.WriteLine("Drive Letter:    {0}", sd.DriveLetter);
            Console.WriteLine("Total Size:      {0}", sd.TotalSpace);
            Console.WriteLine("Volume Label:    {0}", sd.DriveLabel);
            Console.WriteLine("Free Space:      {0}", sd.FreeSpace);
            Console.WriteLine("Drive Format:    {0}", sd.DriveType);
            Console.ReadLine();
        });

        #endregion

        #region persist graph

        DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver");
        db.Servers.InsertOnSubmit(server);
        db.SubmitChanges();

        #endregion
于 2012-08-07T13:31:54.487 に答える
0

苦労して実現した後、答えはメソッドとクラスのスコープにありました..

誰かが私がしたことを見たいと思っている場合に備えて::

public class Program
{
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); //Get all the drive info
    Server server = new Server();  //Create  the server object
    ServerDrive serverDrives = new ServerDrive();

    public void Main()
    {
        Program c = new Program();
        c.FakeDriveInfo();
        c.RealDriveInfo();
        c.WriteInToDB();
    }

    public static string FormatBytes(long bytes)
    {
        const int scale = 1024;
        string[] orders = new string[] { "GB", "MB", "KB", "Bytes" };
        long max = (long)Math.Pow(scale, orders.Length - 1);
        foreach (string order in orders)
        {
            if (bytes > max)
            {
                return string.Format("{0:##.##} {1}", Decimal.Divide(bytes, max), order);
            }

            max /= scale;
        }
        return "0 Bytes";
    }

    public void FakeDriveInfo()
        {

            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("Server ID :      {0}", server.ServerID = 0);
            Console.WriteLine("Server Name :    {0}", server.ServerName = string.Concat(System.Environment.MachineName));
            Console.WriteLine();


            for (int i = 0; i < driveList.Count; i++)
            {

                Console.WriteLine("Drive Letter:    {0}", driveList[i].Name);
                Console.WriteLine("Total Size:      {0}", FormatBytes(driveList[i].TotalSize));
                Console.WriteLine("Volume Label:    {0}", driveList[i].VolumeLabel);
                Console.WriteLine("Free Space:      {0}", FormatBytes(driveList[i].TotalFreeSpace));
                Console.WriteLine("Drive Format:    {0}", driveList[i].DriveFormat);
                Console.ReadLine();
            }
        }

    public void RealDriveInfo()
         {


            //Insert information of one server - You will need get information of all servers
            server.ServerID = 0; //Here is necessery put PK key. I recommend doing the SQL server will automatically generate the PK.
            server.ServerName = string.Concat(System.Environment.MachineName);

            //Inserts information in the newServers object
            for (int i = 0; i < driveList.Count; i++)
            {

                //Put here all the information to obeject Server                
                serverDrives.DriveLetter = driveList[i].Name;
                serverDrives.TotalSpace = driveList[i].TotalSize;
                serverDrives.DriveLabel = driveList[i].VolumeLabel;
                serverDrives.FreeSpace = driveList[i].TotalFreeSpace;
                serverDrives.DriveType = driveList[i].DriveFormat;
                server.ServerDrives.Add(serverDrives);

            }
         }

    public void WriteInToDB()
    {
        //Add the information to an SQL Database using Linq.
        DataClasses1DataContext db = new DataClasses1DataContext(@"cspsqldev");
        //   db.Servers.InsertAllOnSubmit(server);
        db.Servers.InsertOnSubmit(server);
        db.SubmitChanges();
    }

すべてのメソッドで見たい部分を Class スコープに移動するだけで、機能するようになりました。

フィードバックをお寄せいただきありがとうございます:)

于 2012-08-08T11:49:12.840 に答える