防止对象在流畅的构建器模式 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
};
}
}
乍一看,这种方法可能有效,但它有安全漏洞,例如
- 用户可以直接使用
Request request = new Request()
创建请求
如果我通过在请求中实现参数化构造函数来限制请求class class
public Request(RequestBuilder rb){
UserName = rb._username;
Password = rb._password;
Token = rb._token;
}
在这种情况下,我需要在 RequestBuilder
中创建 set
和 get
方法,最终将 RequestBuilder
公开如下
RequestBuilder rb = new RequestBuilder();
rb._username ="test";
谁能告诉我如何保护 Request
class 防止实例化。
我试图找到解决方案,结果如下
- 使用
Builder
作为嵌套 class
- 使
Request
class 默认构造函数私有化。然而,Builder
是一个嵌套的 class 它可以访问请求 class 并实例化它
- 为了创建
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;
}
}
}
我正在尝试创建流畅的构建器模式来创建用户请求,因为它有很多参数。为简单起见,我只显示了几个参数
这是我的要求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
};
}
}
乍一看,这种方法可能有效,但它有安全漏洞,例如
- 用户可以直接使用
Request request = new Request()
创建请求
如果我通过在请求中实现参数化构造函数来限制请求class class
public Request(RequestBuilder rb){ UserName = rb._username; Password = rb._password; Token = rb._token; }
在这种情况下,我需要在 RequestBuilder
中创建 set
和 get
方法,最终将 RequestBuilder
公开如下
RequestBuilder rb = new RequestBuilder();
rb._username ="test";
谁能告诉我如何保护 Request
class 防止实例化。
我试图找到解决方案,结果如下
- 使用
Builder
作为嵌套 class - 使
Request
class 默认构造函数私有化。然而,Builder
是一个嵌套的 class 它可以访问请求 class 并实例化它 - 为了创建
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;
}
}
}