предотвратить создание объекта в беглом шаблоне C # - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать свободный шаблон для создания запроса пользователя, так как у него много параметров. для простоты я просто показываю несколько параметров

Вот мой класс запроса или модель

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

        public string Password {  get; set; }

        public string Token {  get; set; }


    }

Вот мой класс строителя, который строит запросы.

 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. если я ограничу класс запроса, реализовав параметризованный конструктор в классе запроса

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

В этом случае мне нужно создать set и get метод в RequestBuilder, который в конечном итоге выставит RequestBuilder следующим образом

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

поэтому кто-нибудь может сказать мне, как мне защитить класс Request, предотвращающий создание экземпляров.

1 Ответ

0 голосов
/ 14 ноября 2018

Я попытался найти решение и в итоге получил следующее

  1. , используя Builder в качестве вложенного класса
  2. , делая Request конструктор класса по умолчанию закрытым.Тем не менее, Builder является вложенным классом, он может получить доступ к классу запроса и создать его экземпляр
  3. . Чтобы создать объект класса Request, пользователь должен пройти только Builder.

Request request = новый 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;
            }


        }
    }
...