根据条件初始化类成员

时间:2014-05-27 19:32:32

标签: c#

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

1。医生:他们可以根据patientidhospitalid进行搜索 的 2。警方:他们可以根据patientidhospitalidfirstnamelastname进行搜索。

我打算为搜索条件创建一个类,如下所示:

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

我应该如何强制执行Patient用户类型只是初始化两个属性的规则? 这是一个很好的设计,可以将searchcriteria保留在一个类中,还是应该完全独立于PatientPolice? (在这种情况下,如果新用户进来,我需要再添加一个类)

4 个答案:

答案 0 :(得分:2)

您可以为该类型创建两个不同的构造函数,一个用于两个字段,一个用于所有四个,但这并不能使调用者明白这一点时应该使用它们。通过使用静态工厂方法创建类型的实例来增加更多清晰度:

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,
        };
    }
}

当然,一旦构建了一个对象,我们就不再需要关心它是患者还是警察搜索,我们只是按照有价值的搜索条件行事。 (当这样做时,重要的是每个字段的默认值意味着“不要搜索它”以使其起作用。)

答案 1 :(得分:1)

由于您有医生可用的基本搜索条件,然后是警察的更专业的搜索条件,您可以使用继承:

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;}

}

答案 2 :(得分:0)

我认为searchcriteria是一个纯数据类,强制执行这种约束不是它的关注点。

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

答案 3 :(得分:0)

我想了解更多信息以便更好地了解您的问题......

但如果我做对了,你必须要有不同类型的用户,而且每个用户都可以根据不同的标准进行搜索,那可以吗?

这就是我要解决的问题。

  1. 获取用户的角色(了解他/她是否是一名警察或警察。
  2. 一旦我获得了用户的角​​色,我将为每个用户做一个有条件的持有不同的选项。在.Net VB它会是这样的:
  3. (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查询会是这样的(对于rol 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
    

    我希望这能为你提供一些如何解决这个问题的线索。