C# 在维护私有列表的同时公开方法的最佳方式

C# Best way to expose a method while maintaining a private list

我实际上是在尝试从对象列表中撤回自定义 class 而不公开我的列表。下面是我是如何让它工作的,但我认为这不是最优雅的方式。另外 - 如何在不实例化新 class 的情况下调用此调用的实例?我想在一行中完成所有事情。

我希望能够在一行中调用我的请求

Library.ConnectionController cc = new Library.ConnectionController();
cc = cc.Request("z");

这是我的 class

class Library
{
    public ConnectionController Retrieve_Controller_By_Domain(string Domain)
    {
        ConnectionController cc = new ConnectionController();
        cc = cc.Request(Domain);
        return cc;
    }

    internal class ConnectionController
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string ProjectName { get; set; }
        public string Domain { get; set; }
        public string SQLServer { get; set; }
        public string SQLDatabase { get; set; }

        public ConnectionController Request(string Domain)
        {
            InternalLibrary il = new InternalLibrary();
            ConnectionController Requested = il.ccList.Where(m => m.Domain.ToUpper() == Domain.ToUpper())
                .Select(m => new ConnectionController
                {
                    UserName = m.UserName,
                    Password = m.Password,
                    ProjectName = m.ProjectName,
                    Domain = m.Domain,
                    SQLServer = m.SQLServer,
                    SQLDatabase = m.SQLDatabase
                }).ToList()[0];

            return Requested;
        }
    }

    private class InternalLibrary
    {
        public List<ConnectionController> ccList
        {
            get
            {
                return (new List<ConnectionController> { 
                    new ConnectionController() { 
                        UserName = "x", 
                        Password="y",
                        ProjectName="r",
                        Domain = "z", 
                        SQLDatabase = "a", 
                        SQLServer = "b"
                    }
                });
            }
        }
    }
}

这是您以更简单的方式编写的代码版本

namespace Library
{
public class ConnectionController
{
    private static readonly List<ConnectionController> CcList = new List<ConnectionController>
    {
        new ConnectionController
        {
            UserName = "x",
            Password = "y",
            ProjectName = "r",
            Domain = "z",
            SQLDatabase = "a",
            SQLServer = "b"
        }
    };

    public string UserName { get; set; }
    public string Password { get; set; }
    public string ProjectName { get; set; }
    public string Domain { get; set; }
    public string SQLServer { get; set; }
    public string SQLDatabase { get; set; }

    public static ConnectionController Request(string domain)
    {
        return CcList.Where(m => m.Domain.ToUpper() == domain.ToUpper())
            .Select(m => new ConnectionController
            {
                UserName = m.UserName,
                Password = m.Password,
                ProjectName = m.ProjectName,
                Domain = m.Domain,
                SQLServer = m.SQLServer,
                SQLDatabase = m.SQLDatabase
            }).ToList()[0];
    }
}
}

那么你可以

var requesteed =  ConnectionController.Request("x");

我不明白你到底想要什么。但这里是使用一些基本思想的更正版本:

  1. 使用static方法检索controller。由于找不到具有请求名称的 controller,我们需要调用一些外部请求函数。所以最好的办法就是让static函数变成returned type.
  2. 在 InternalLibrary 中使用静态 list,因此它只会被创建(或评估)一次。
  3. 使用 FirstOrDefault() LINQ 扩展方法,因为结果可能为空。

代码如下:

public class Library
{
    public class ConnectionController
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public string ProjectName { get; set; }
        public string Domain { get; set; }
        public string SQLServer { get; set; }
        public string SQLDatabase { get; set; }

        public static ConnectionController Request(string Domain)
        {
            return InternalLibrary.ccList.
                Where(m => m.Domain.Equals(Domain, 
                           StringComparison.CurrentCultureIgnoreCase)).
                FirstOrDefault();
        }
    }

    private class InternalLibrary
    {
        public static readonly List<ConnectionController> ccList =
            new List<ConnectionController>
            { 
                new ConnectionController()
                { 
                    UserName = "x", 
                    Password="y",
                    ProjectName="r",
                    Domain = "z", 
                    SQLDatabase = "a", 
                    SQLServer = "b"
                }
            };
    }
}

你可以像这样使用它(注意 controller 可以是 null

var controller = Library.ConnectionController.Request("z");

P.S。我没有删除 InternalLibrary class 假设这不仅仅是一个硬编码列表,而是具有一些分离逻辑的复杂 class。