【问题标题】:MVC3 accessing Repository in ControllersMVC3 访问控制器中的存储库
【发布时间】:2013-03-17 18:27:43
【问题描述】:

感谢您的帮助!我下面的解决方案已更新为正确答案。

我有一个关于如何访问我的控制器的存储库的简单问题。如果您查看我的 addMovie 方法,我想我可以在控制器继承 IMovieRepository 之后在 ModelState.IsValid 中执行 movies.AddMovie(movie) 。

IMovieRepository:

public interface IMovieRepository : IDisposable
{
    IEnumerable<Movies> GetMovies();
    Movies GetMovieByID(int id);
    void AddMovie(Movies movie);
    void UpdateMovie(Movies movie);
    void DeleteMovie(int id);
    void save(Movies movie);
}

电影存储库:

public class MovieRepository : BaseRepository, IMovieRepository
{
    private MovieContext db;

    public MovieRepository(MovieContext repo)
    {
        db = repo;
    }

    public IEnumerable<Movies> GetMovies()
    {
        return db.Movies.ToList();
    }

    public Movies GetMovieByID(int id)
    {
        return db.Movies.Find(id);
    }

    public void AddMovie(Movies movie)
    {
        db.Movies.Add(movie);
    }

    public void UpdateMovie(Movies movie)
    {
        db.Entry(movie).State = EntityState.Modified;
    }

    public void DeleteMovie(int id)
    {
        Movies movie = db.Movies.Find(id);
        db.Movies.Remove(movie);
    }

    public void save(Movies movie)
    {
        if (movie.movieID == 0)
            db.Movies.Add(movie);
        else
            db.Entry<Movies>(movie).State = System.Data.EntityState.Modified;

        db.SaveChanges();
    }
}

NinjectDependencyResolve:

Bind<IMovieRepository>().To<MovieRepository>();

电影控制器:

public class MoviesController : Controller
{
    private IMovieRepository movieRepository;

    public MoviesController()
    {
        this.movieRepository = new MovieRepository(new MovieContext());
    }

    public MoviesController(IMovieRepository movieRepository)
    {
        this.movieRepository = movieRepository;
    }
    #region "GET"
    //
    // GET: /Admin/Movies/

    public ActionResult Index()
    {
        return View();
    }
    #endregion

    #region "POST"
    [HttpPost]
    public ActionResult addMovie(Movies movie)
    {
        if (ModelState.IsValid)
        {
            movieRepository.AddMovie(movie);
            movieRepository.save(movie);
            return RedirectToAction("index", "movies");
        }
        return View(movie);
    }
    #endregion
}

}

【问题讨论】:

  • 您不应该将您的问题更改为您的解决方案。这不允许其他人从问题/答案中受益。如果您想包含答案,请将其添加到问题的末尾。

标签: c# asp.net-mvc repository


【解决方案1】:

您需要向控制器添加一个构造函数:

private IMovieRepository _Repository;

[Inject]
public MovieController(IMovieRepository repository)
{
    _Repository = repository;
}

【讨论】:

  • 谢谢,解决了! [Inject] 有什么作用?
  • 由于您使用的是 Ninject,因此您需要该属性以便 Ninject 知道依赖注入发生的位置。否则,你会得到一个错误,说你需要一个无参数的构造函数。
【解决方案2】:
private IMovieRepository _repository;

public MoviesController(IMovieRepository repository)
{
  _repository =repository; 
}  

使用构造函数注入

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2011-06-12
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多