mardi 13 novembre 2018

prevent object from instantiation in fluent builder pattern C#

i am trying to create fluent builder pattern to create user request as it has lot of parameters. for simplicity i am just showing few parameters

Here is my request class or the model

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

        public string Password {  get; set; }

        public string Token {  get; set; }


    }

Here is my builder class that build the requests.

 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

            };
        }
    }

At a glance this approach might look working but it has security holes like

  1. User can create Request direct using Request request = new Request()
  2. if i restric the request class by implementing the parameterized constructor

in Request class

public Request(RequestBuilder rb){

            UserName = rb._username;
            Password = rb._password;
            Token    = rb._token;

        }

In this case i need to create set and get method in RequestBuilder which will eventually expose RequestBuilder as follows

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

so can anyone tell me how shall i protect Request class preventing from instantiation.

Aucun commentaire:

Enregistrer un commentaire