基于条件初始化类成员

本文关键字:初始化 成员 条件 于条件 | 更新日期: 2023-09-27 18:05:20

我的应用程序有两种类型的用户,这是一个允许用户根据患者信息搜索医疗记录的搜索工具。

1。医师:他们可以根据patientidhospitalid进行搜索
2。警察:他们可以根据patientid, hospitalid, firstnamelastname进行搜索。

我计划为搜索条件创建一个类,像这样:

public class searchcriteria
{
  int? patientid
  int? hospitalid
  string firstname
  string lastname
}

我应该如何强制Patient用户类型只初始化两个属性的规则?这是一个很好的设计,保持搜索条件在一个类或应该完全分开的PatientPolice ?(在这种情况下,如果新用户进来,我需要添加一个类)

基于条件初始化类成员

您可以为该类型创建两个不同的构造函数,一个用于其中两个字段,另一个用于所有四个字段,但这并不能使调用者清楚地知道何时应该使用哪个。通过使用静态工厂方法来创建类型为

的实例,可以增加更多的清晰度:
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是一个纯数据类,它不需要强制执行这种约束。

也许您可以创建两个单独的方法来执行搜索,一个用于按patientidhospitalid进行搜索,另一个用于按所有字段进行搜索。将它们放在单独的接口中(例如IRestrictedSearchIFullSearch,或IPhysicianSearchIPoliceSearch),并确保只给执行医生/警察搜索的代码提供适当的接口。

我想要更多的信息来更好地了解你的问题…

但是如果我说对了,你必须有不同类型的用户,每个人都可以根据不同的标准进行搜索,这样可以吗?

这就是我要做的来解决这个问题。

  1. 获取用户的角色(查看他/她是医生还是警察)
  2. 一旦我得到了用户的角色,我将为每个用户创建一个保留不同选项的条件。在。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
我希望这能给你一些解决这个问题的线索。