防止对象在流畅的构建器模式 C# 中实例化

prevent object from instantiation in fluent builder pattern C#

我正在尝试创建流畅的构建器模式来创建用户请求,因为它有很多参数。为简单起见,我只显示了几个参数

这是我的要求class或模型

public class Request
    {
        public string UserName {  get; set; }

        public string Password {  get; set; }

        public string Token {  get; set; }


    }

这是构建请求的构建器 class。

 public class RequestBuilder
    {
        private string _username;
        private string _password;
        private string _token;

        public RequestBuilder UserName(string username)
        {
            _username = username;
            return this;

        }

        public RequestBuilder Password(string password)
        {
            _password = password;
            return this;

        }

        public RequestBuilder Token(string token)
        {
            _token = token;
            return this;

        }

        public static implicit operator Request(RequestBuilder requestBuilder)
        {

            return new Request()
            {

                UserName = requestBuilder._username,
                Password = requestBuilder._password,
                Token = requestBuilder._token

            };
        }
    }

乍一看,这种方法可能有效,但它有安全漏洞,例如

  1. 用户可以直接使用Request request = new Request()
  2. 创建请求
  3. 如果我通过在请求中实现参数化构造函数来限制请求class class

     public Request(RequestBuilder rb){                      
            UserName = rb._username;
            Password = rb._password;
            Token    = rb._token;                    
     }
    

在这种情况下,我需要在 RequestBuilder 中创建 setget 方法,最终将 RequestBuilder 公开如下

RequestBuilder rb = new RequestBuilder();
rb._username ="test";

谁能告诉我如何保护 Request class 防止实例化。

我试图找到解决方案,结果如下

  1. 使用 Builder 作为嵌套 class
  2. 使 Request class 默认构造函数私有化。然而,Builder 是一个嵌套的 class 它可以访问请求 class 并实例化它
  3. 为了创建 Request class 的对象,用户必须仅通过 Builder

Request request = new Request.Builder().UserName("user").Password("abc").Build();

示例代码

public class Request
    {
        public string UserName {   get; private set; }

        public string Password {  get; private set; }

        public string Token { get; private set; }


        private Request(){




        }

        public class Builder
        {

            private Request request = new Request();

            public Builder UserName(string username)
            {
                request.UserName = username;
                return this;

            }

            public Builder Password(string password)
            {
                request.Password = password;
                return this;

            }

            public Builder Token(string token)
            {
                request.Token = token;
                return this;

            }


            public Request Build()
            {

                return request;
            }


        }
    }