工厂或服务模式或方法注入?

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)

Joh*_*her 5

开发的主要目标应该是使用最简单,最干净的代码来满足要求.(http://msdn.microsoft.com/en-us/magazine/cc163962.aspx)

话虽如此,除非您有特定的理由使用其中一种模式,否则立即停止.如果没有具体的理由去做这项工作,你只需编写更多的代码,希望它有一天会有用.只要写出有效的方法.如果需要,稍后重构它.

如果需要,继续沿着保持简单的道路前进.选择一个模式,库或其他工具,使您可以编写干净,简单,可读的代码来完成工作.