基于条件初始化类成员
本文关键字:初始化 成员 条件 于条件 | 更新日期: 2023-09-27 18:05:20
我的应用程序有两种类型的用户,这是一个允许用户根据患者信息搜索医疗记录的搜索工具。
1。医师:他们可以根据patientid
和hospitalid
进行搜索
2。警察:他们可以根据patientid
, hospitalid
, firstname
和lastname
进行搜索。
我计划为搜索条件创建一个类,像这样:
public class searchcriteria
{
int? patientid
int? hospitalid
string firstname
string lastname
}
我应该如何强制Patient
用户类型只初始化两个属性的规则?这是一个很好的设计,保持搜索条件在一个类或应该完全分开的Patient
和Police
?(在这种情况下,如果新用户进来,我需要添加一个类)
您可以为该类型创建两个不同的构造函数,一个用于其中两个字段,另一个用于所有四个字段,但这并不能使调用者清楚地知道何时应该使用哪个。通过使用静态工厂方法来创建类型为
的实例,可以增加更多的清晰度:public class SearchCriteria
{
//prevent construction without using a factory method
private SearchCriteria() { }
public int? PatientId { get; private set; }
public int? HospitalId { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public static SearchCriteria CreatePatientSearch(
int? patendId, int? hospitalId)
{
return new SearchCriteria()
{
PatientId = patendId,
HospitalId = hospitalId
};
}
public static SearchCriteria CreatePoliceSearch(
int? patendId, int? hospitalId,
string firstName, string lastName)
{
return new SearchCriteria()
{
PatientId = patendId,
HospitalId = hospitalId,
FirstName = firstName,
LastName = lastName,
};
}
}
当然,一旦构造了对象,我们就不再需要关心它是Patient还是Police搜索,我们只需根据有值的搜索条件进行操作。(当这样做时,重要的是每个字段的默认值意味着"不要在它上面搜索"。)
由于内科医生有一个基本搜索条件,警察有一个更专门的搜索条件,因此可以这样使用继承:
public class SearchCriteria
{
public SearchCriteria(int patientId, int hospitalId)
{
PatientId = patientId;
HospitalId = hospitalId;
}
public int PatientId {get;set;}
public int HospitalId {get;set;}
}
public class PoliceSearchCriteria : SearchCriteria
{
public PoliceSearchCriteria(int patientId, int hospitalId, string first, string last)
: base(patientId, hospitalId)
{
FirstName = first;
LastName = last;
}
public string FirstName {get;set;}
public string LastName {get;set;}
}
我认为searchcriteria是一个纯数据类,它不需要强制执行这种约束。
也许您可以创建两个单独的方法来执行搜索,一个用于按patientid
和hospitalid
进行搜索,另一个用于按所有字段进行搜索。将它们放在单独的接口中(例如IRestrictedSearch
和IFullSearch
,或IPhysicianSearch
和IPoliceSearch
),并确保只给执行医生/警察搜索的代码提供适当的接口。
我想要更多的信息来更好地了解你的问题…
但是如果我说对了,你必须有不同类型的用户,每个人都可以根据不同的标准进行搜索,这样可以吗?
这就是我要做的来解决这个问题。
- 获取用户的角色(查看他/她是医生还是警察)
- 一旦我得到了用户的角色,我将为每个用户创建一个保留不同选项的条件。在。net VB中,它会像这样:
(Code for Default.aspx.vb)
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSearch.Click
Dim sRol As String = Roles.GetRolesForUser.Single()
Dim sUser As String = User.Identity.Name
If sRol = "Phyisician" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=1"
Response.Redirect(searchUrl)
End If
If sRol = "Police" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=2"
Response.Redirect(searchUrl)
End If
End Sub
然后,在搜索结果页面上,我将使用不同的SQL存储过程处理代码:
(search.aspx.vb)Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim sRol As String = Roles.GetRolesForUser.Single()
Dim sUser As String = User.Identity.Name
If sRol = "Phyisician" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=1"
Response.Redirect(searchUrl)
End If
If sRol = "Police" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=2"
Response.Redirect(searchUrl)
End If
Dim prm As String = Request.QueryString("searchprm").ToString
Dim rus As String = Request.QueryString("susrrol").ToString
If rus = 1 Then
Dim CountResults As String
Dim strConn1 As String = ConfigurationManager.ConnectionStrings("YourConnection").ToString
Dim cmd1 As New SqlCommand("SEL_COUNT_Hits_Rol1", New SqlConnection(strConn1))
cmd1.CommandType = CommandType.StoredProcedure
cmd1.Connection.Open()
Dim sP1 As New SqlParameter("@search", SqlDbType.VarChar)
sP1.Direction = ParameterDirection.Input
sP1.Value = prm
cmd1.Parameters.Add(sP1)
CountResults = String.Format("{0:##,###.##}", cmd1.ExecuteScalar())
cmd1.Connection.Close()
lblHits.Text = "<i>We have found " & CountResults & " patients who match your search terms:" & "</i>"
End If
If rus = 2 Then
Dim CountResults As String
Dim strConn1 As String = ConfigurationManager.ConnectionStrings("YourConnection").ToString
Dim cmd1 As New SqlCommand("SEL_COUNT_Hits_Rol2", New SqlConnection(strConn1))
cmd1.CommandType = CommandType.StoredProcedure
cmd1.Connection.Open()
Dim sP1 As New SqlParameter("@search", SqlDbType.VarChar)
sP1.Direction = ParameterDirection.Input
sP1.Value = prm
cmd1.Parameters.Add(sP1)
CountResults = String.Format("{0:##,###.##}", cmd1.ExecuteScalar())
cmd1.Connection.Close()
lblHits.Text = "<i>We have found " & CountResults & " patients who match your search terms:" & "</i>"
End If
End Sub
然后,在前面的代码,我将绑定一个gridview与发现的日期。可能,SQL查询是这样的(对于角色1 -医师):
SELECT COUNT(*) FROM [dbo].[Patients] WHERE([PId] = @prm)
对于gridview:
SELECT * FROM [dbo].[Patients] WHERE([PId] = @prm) ORDER BY [PId] ASC
对于警察(角色2):
SELECT COUNT(*) FROM [dbo].[Patients] WHERE(FREETEXT(*, @prm))
:
SELECT * FROM [dbo].[Patients] WHERE(FREETEXT(*, @prm)) ORDER BY [PId] ASC