在找到将Services/ViewModel放入MVC应用程序的正确位置时遇到问题

Pau*_*aul 2 s#arp-architecture asp.net-mvc-3

我有一个带有以下项目/层的S#arp MVC应用程序:

  • 核心(型号)
  • 数据
  • 网页(查看)
  • 控制器
  • 服务

一个显示问题的例子:
我有一个模型:

public class Ticket : Entity
{
     public virtual string Summary { get; set; }
     public virtual string Description { get; set; }       
     public virtual DateTime CreateOn { get; set; }        
     public virtual DateTime UpdatedOn { get; set; }
     public virtual User CreatedBy { get; set; }
     public virtual User AssignedTo { get; set; }
     public virtual Priority Priority { get; set; }        
     public virtual Status Status { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

它位于核心项目......

到我的View Create(Ticket)我需要一个CreateTicketViewModel:

public class CreateTicketVM
{
     [Required(ErrorMessage = "Required.")]
     public string Summary { get; set; }

     [Display(Required(ErrorMessage = "Required.")]
     public string Description { get; set; }

     [Required(ErrorMessage = "Required.")]
     public int AssignedToId { get; set; }     

     [Required(ErrorMessage = "Required.")]
     public int PriorityId { get; set; }

     [Required(ErrorMessage = "Required.")]
     public virtual int StatusId { get; set; }      

     public IList<User> Users { get; set; }       
     public IList<Priority> Priorities { get; set; }
     public IList<Status> Status { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

它位于控制器项目......

到目前为止一切都很好......但在我的TicketController中,我需要填写所有CreateTicketVM列表(View中的下拉列表).

所以我创建了一个TicketService:

public class TicketService : ITicketService
{       
     readonly IRepository<User> userRepository;
     readonly IRepository<Priority> priorityRepository;
     readonly IRepository<Status> statusRepository;
     ...     

     public CreateTicketVM CreateNewCreateTicketVM()
     {
         var _ticket = new CreateTicketVM();
         _ticket.Priorities = priorityRepository.GetAll();
         _ticket.Status = statusRepository.GetAll();
         _ticket.Users = userRepository.GetAll();
          _ticket.Categories = categoryRepository.GetAll();
          return _ticket;
     }
}
Run Code Online (Sandbox Code Playgroud)

它位于服务项目......

问题出在Interface ITicketService上:

public interface ITicketService
{
    CreateTicketVM CreateNewCreateTicketVM();
}
Run Code Online (Sandbox Code Playgroud)

它位于Core项目......但Core Project不能包含Controller项目(CreateTicketVM)......

那么,我该怎么处理呢?

谢谢

保罗

Chr*_*isR 7

我会在您的Controllers项目中为此创建一个增强的查询对象,而不是将CreateNewCreateTicketVM方法放在您的服务上.然后,服务层仅关注行为.

看我的博文:

http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/

和艾恩德的评论:

http://ayende.com/Blog/archive/2011/04/01/code-review-sharparchitecture.multitenant.aspx

  • 不,对S#arp代码的更改仅适用于多租户支持,但无论如何都在1.9.6版本中.您只需要将NHibernateQuery基类添加到Data项目中,创建查询接口和类,并确保它们已在容器中注册(请参阅SharpArchitecture-MultiTenant.Web/CastleWindsor/ComponentRegistrar.cs) (2认同)