0

私は Entity Framework を使用しており、次のようなエンティティがあります。

    public class User : IEntity
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Required]
        public String Email { get; set; }

        public virtual ICollection<Project> UserProjects { get; set; }
    }

public class Project : IEntity
{
    [Key]
    public int ProjectId { get; set; }

    public String Title { get; set; }

    public String Description { get; set; }

    [ForeignKey("UserOwner")]
    public int UserOwnerId { get; set; }
    public virtual User UserOwner { get; set; }
}

また、Repository パターンと Unit Of Work パターンも使用します。たとえば、プロジェクト リポジトリのみを含むプロジェクト ロジック クラスにメソッド CreateProject(String title, String description, String userOwnerEmail) があります。また、メールでユーザーを取得できる UserLogic クラスもあります。

CreateProject メソッドでメールでユーザーを取得して、プロジェクト所有者のように指定する方法を教えてください。

主な目的は、疎結合メソッドを作成することです。

この例は悪いと思います:

    public void CreateNewProject(String projectName, String description,String usersEmail)
    {
        var usersLogic = kernel.Get<IUsersServices>();
        User owner = usersLogic.GetUserByEmail(usersEmail);
        unit.Repository<Project>()
            .Insert(new Project
                {
                    Title = projectName,
                    Description = description,
                    CreationDate = DateTime.Now,
                    UserOwner = owner,
                    UsersIncludeedInProject = new List<User>()
                });
        unit.Save();
    } 
4

1 に答える 1

0

ビジネス ロジックとエンティティ フレームワーク (またはその他の ORM) は、同じフレーズには属しません。懸念事項の分離が原則です。

class Project
{
     public Project(IProjectRepository repo, IUsersServices userServ){}

     public void CreateNewProject(String projectName, String description,String usersEmail)
      {
          var owner=_users.GetByEmail(usersEmail);

           //create project\\

          _repository.Save(project);
       }

もう 1 つの方法は、User オブジェクトを引数として渡すことです。これは、UserService または UserRepository に GetUserByEmail() を要求することによって取得されるオブジェクトです。ただし、CreateNewProject メソッドの外側になります。

var user= _usersService.GetByEmail();
var project=project.CreateNewProject(projectName,projectDescription,user);
_projectRepository.Save(project);

この場合、CreateNewProject はまさにそれを行います。おそらく、プロジェクトを保存することは問題ではないからです。この 2 番目のアプローチをお勧めします。

于 2013-04-17T08:50:45.480 に答える