在构造函数中使用此运算符初始化对象

Initializing objects using this operator in constructors

当我尝试在 MVC 中使用存储库模式实现代码优先方法时,我遇到了一些困难,如下所示:

我有一个接口,其中声明的方法很少,如下所示:

public interface IRepository
    {
        User Getuserdetail(int UserId);
        void Save(User Obj);
        void delete(int Userid);
        void update(User user);
    }

然后我有一个存储库 class,它可以使用上面的接口来定义所有方法,并将创建一个单独的层 Entity Framework:

public class Repository : IRepository
    {
            RepoDBContext _context;
            Repository(RepoDBContext Context)
            {
                this._context = Context;
            }

        public User Getuserdetail(int Userid)
        {
            var user = _context.User.Where(m => m.id == Userid).FirstOrDefault();
            return user;
        }
        public void Save(User user)
        {
            _context.User.Add(user);
            _context.SaveChanges();
        }
}

现在请检查此 class 的构造函数。此构造函数正在初始化的变量是 "RepoDBContext" 类型,它用来分配它的引用类型也是 "RepoDBContext"。它的内部表现是否如下所示?

RepoDBContext _context=new RepoDBContext();

我的 RepoDBContext class 如下:

  public class RepoDBContext : DbContext
            {
                public DbSet<User> User { get; set; }
            }

此外,如果这是正确的执行方式,那么我将如何在我的控制器中调用此 class 以在我的用户界面上执行某些功能。请就此进行指导,请不要介意我的英语。谢谢

不,将 RepoDBContext 的现有实例分配给变量与调用 new RepoDBContext() 不同。赋值只是赋值,不会分配新的对象。

Off-topic: 另请考虑 C# 编码指南建议方法参数应命名为 likeThis(即首字母小写)。这将使您的代码与其他 .Net 代码库更加一致。

我认为您已经在评论和 Oskar 和 Kirk 的回答中找到了问题 does assigning a parameter to a field is equivalent to instantiating a new instance of that type 的答案。

但我只想更进一步,尝试回答您的另一个问题:how will I have to call this class in my controller to do some functionality over my user interface.

如果您使用 Repository 模式创建结构,您不会希望您的控制器处理 DbContext 的实例 class,因为如果它们这样做,那么拥有一个单独的存储库层有什么好处呢? ?我看到人们使用并且我自己在多个应用程序中使用的常见模式如下:

IUserRepository

public interface IUserRepository
{
    User GetUserDetail(int userId);
    void Save(User user);
    void Delete(int userId);
    void Update(User user);
}

用户资料库

public class UserRepository : IUserRepository
{
    public User GetUserDetail(int userId)
    {
        using(var _context = new RepoDBContext())
        {
            return _context.User.Where(m => m.id == userId).FirstOrDefault();
        }       
    }

    //other implementations here..
}

然后,您创建另一个层作为您的业务层,类似于存储库。

IUserBusiness

public interface IUserBusiness
{
    User GetUserDetail(int userId);
    void Save(User user);
    void Delete(int userId);
    void Update(User user);
}

用户业务

public class UserBusiness : IUserBusiness
{
    private readonly IUserRepository userRepository;

    //CTOR receives a Repository instance via DI
    public UserBusiness(IUserRepository userRepository)
    {
        this.userBusiness = userBusiness;
    }

    public User GetUserDetail(int userId)
    {
        //Call repository to get User details
        return this.userRepository.GetUserDetail(userId);
    }

    //other implementations here
}

用户控制器(示例)

public class UserController : Controller
{
    private readonly IUserBusiness userBusiness;

    //Controller receives a UserBusinnes instance via DI
    public UserController(IUserBusiness userBusiness)
    {
        this.userBusiness = userBusiness;
    }

    public ActionResult GetDetail(int userId)
    {
        //Call your "repository" to get user data
        var userDetail = userBusiness.GetUserDetail(userId);

        //more logic here
    }
}

看出区别了吗?应用程序的每一层都关注一件事。您的控制器向您的业务层请求数据,它可能会应用一些业务规则或验证,最后调用您的存储库层 它知道如何与数据库或其他存储进行对话。您的控制器不关心如何创建数据库实例 class 或进行查询。它只是接收一个请求,请求数据并 returns 返回给调用者。