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

时间:2016-01-17 13:42:12

标签: c# asp.net-mvc-3 asp.net-mvc-4 constructor

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

我有一个接口,其声明的方法如下:

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

然后我有一个Repository类,它可以使用上面的接口来定义所有方法,并将创建一个单独的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();
        }
}

现在请你检查一下这个类的构造函数。该构造函数初始化的变量是“RepoDBContext”的类型,它用于分配它的引用类型也是“RepoDBContext”。内部表现如下吗?

RepoDBContext _context=new RepoDBContext();

我的RepoDBContext课程如下:

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

此外,如果是正确的执行方式,那么我将如何在我的控制器中调用此类来通过我的用户界面执行某些功能。请指导相同的,请不要介意我的英语。感谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我认为你已经在评论和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类的实例,因为如果它们这样做,那么拥有一个单独的存储库层有什么好处呢?我看到人们使用的一种常见模式,我自己在几个应用程序中使用它的方法如下:

<强> IUserRepository

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

<强> UserRepository

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);
}

<强> UserBusiness

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
}

UserController (示例)

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
    }
}

看到区别?您的应用程序的每一层都关注一件事。您可以请求数据业务层,这可能会应用一些业务规则或验证,最后调用您知道如何通话的存储库层到数据库或其他存储。您的控制器对如何创建数据库类实例或进行查询没有任何顾虑。它只是收到请求,请求数据并返回给调用者。