Chr*_*ris 3 .net c# java design-patterns
我目前正在考虑用什么模式来解决以下问题.
我有一个叫做的实体IdentificationRequest.该实体用于Person通过某些标准来识别.
public class IdentificationRequest
{
public IdentificationCriteria Criteria;
public Person IdentifiedPerson;
protected internal virtual void RedirectToManualIdentification()
{
ChangeState(IdentificationRequestState.ManualIdentificationRequested);
}
public virtual void StartManualIdentification()
{
ChangeState(IdentificationRequestState.ManualIdentificationInProgress);
}
public virtual void AssignIdentifiedPerson(Person person)
{
identifiedPerson = person;
ChangeState(IdentificationRequestState.IdentificationFinished);
}
}
public class IdentificationCriteria
{
public string Name;
}
Run Code Online (Sandbox Code Playgroud)
这是一个简化的例子.实际上,它IdentificationRequest包含更多的信息,以及IdentificationCriteria.
所以基本上客户创建了一个IdentificationRequest,IdentificationCriteria然后确定正确的Person需求.为此,需要将标准传递给持久层,以检查数据库中是否有符合条件的人员.如果不能找到人,则需要人工交互以将正确分配Person给请求.
对于识别过程,我目前正在使用服务.喜欢:
public class IdentificationService : IIdentificationService
{
private readonly IPersonRepository personRepository ;
private readonly IIdentificationRequestRepository identificationRequestRepository;
public IdentificationService(IPersonRepository personRepository )
{
this.personRepository = personRepository ;
}
public bool IdentifyPerson(IdentificationRequest identificationRequest)
{
var matches = personRepository.FindByIdentificationCriteria(identificationRequest.Criteria);
// some additional post analysis of the matches returned from the persistence layer
var criteriaAnalyzer = new IdentificationCriteriaAnalyzer(identificationRequest.Criteria);
var uniqueMatch = criteriaAnalyzer.TryIdentify(matches);
if(uniqueMatch != null)
{
identificationRequest.AssignIdentifiedPerson(uniqueMatch);
return true;
}
else
{
identificationRequest.RedirectToManualIdentification();
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此服务是域程序集的一部分.现在我的问题是,如果这是执行识别的正确模式?或者我会使用工厂来创建识别请求,然后直接尝试识别它,例如:
public class IdentificationRequestFactory
{
private readonly IPersonRepository personRepository;
public IdentificationRequestFactory(IPersonRepository personRepository)
{
this.personRepository = personRepository;
}
public IdentificationRequest Create(IdentificationCriteria identificationCriteria)
{
var request = new IdentificationRequest(identificationCriteria);
var matches = personRepository.FindByIdentificationCriteria(identificationRequest.Criteria);
var criteriaAnalyzer = new IdentificationCriteriaAnalyzer(identificationRequest.Criteria);
var uniqueMatch = criteriaAnalyzer.TryIdentify(matches);
if(uniqueMatch != null)
{
identificationRequest.AssignIdentifiedPerson(uniqueMatch);
}
else
{
identificationRequest.RedirectToManualIdentification();
}
return request;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,IdentificationRequest只能由工厂构建,确保已经完成识别过程并且请求处于有效状态.
或者你会IdentificationRequest通过做一个方法注入来识别自己:
public class IdentificationRequest
{
public IdentificationCriteria Criteria;
public Person IdentifiedPerson;
public void Identify(IPersonRepository personRepository)
{
// identification logic here
}
}
Run Code Online (Sandbox Code Playgroud)
此示例将直接将标识过程耦合到请求.
这种情况的常见模式是什么?反正有共同的模式吗?优缺点都有什么?
Thx提前!
更新
也许我没有正确理解命令模式,但在这种情况下我能得到什么好处呢?以下实现是否正确?
public class IdentificationCommandFactory
{
private readonly IPersonRepository personRepository;
public IdentificationCommandFactory(IPersonRepository personRepository)
{
this.personRepository = personRepository;
}
public IIdentificationCommand Create(IdentificationRequest identificationRequest)
{
var matches = personRepository.FindByIdentificationCriteria(identificationRequest);
var criteriaAnalyzer = new IdentificationCriteriaAnalyzer(identificationRequest);
var uniqueMatch = criteriaAnalyzer.TryIdentify(matches);
if(uniqueMatch != null)
{
return new AssignIdentifiedPersonCommand(identificationRequest, uniqueMatch);
}
else
{
return new RedirectToManualIdentificationCommand(identificationRequest);
}
}
}
public interface IIdentificationCommand
{
void Execute();
}
public class RedirectToManualIdentificationCommand : IIdentificationCommand
{
private readonly IdentificationRequest identificationRequest;
public RedirectToManualIdentificationCommand(IdentificationRequest identificationRequest)
{
this.identificationRequest = identificationRequest;
}
public void Execute()
{
identificationRequest.RedirectToManualIdentification();
}
}
public class AssignIdentifiedPersonCommand : IIdentificationCommand
{
private readonly IdentificationRequest identificationRequest;
private readonly Person personIdentified;
public AssignIdentifiedPersonCommand(IdentificationRequest identificationRequest, Person personIdentified)
{
this.identificationRequest = identificationRequest;
this.personIdentified = personIdentified;
}
public void Execute()
{
identificationRequest.AssignIdentifiedPerson(personIdentified);
}
}
Run Code Online (Sandbox Code Playgroud)
呼叫者,召集者:
var identificationCommandFactory = new IdentificationCommandFactory(personRepository);
var command = identificationCommandFactory.Create(request);
command.Execute();
Run Code Online (Sandbox Code Playgroud)
开发的主要目标应该是使用最简单,最干净的代码来满足要求.(http://msdn.microsoft.com/en-us/magazine/cc163962.aspx)
话虽如此,除非您有特定的理由使用其中一种模式,否则立即停止.如果没有具体的理由去做这项工作,你只需编写更多的代码,希望它有一天会有用.只要写出有效的方法.如果需要,稍后重构它.
如果需要,继续沿着保持简单的道路前进.选择一个模式,库或其他工具,使您可以编写干净,简单,可读的代码来完成工作.
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |