2013-08-18 2 views
0

Привет У меня есть класс модели, который написан в MVC. Я использую первый подход к базе данных Ef. В классе модели у меня есть несколько запросов, связанных с базой данных. У меня есть следующие вопросы:Как я могу назвать класс модели, который написан в MVC?

1) Правильно ли использовать запросы, связанные с базой данных в модели, и вызвать это в контроллере или в представлении?

2) Если да, то где я должен назвать эту модель? В контроллере или в поле зрения?

3) Как я должен назвать эту модель? Скажем, например, у меня класс класса class1.cs в model.How я должен назвать эту модель?

ответ

1

В вашей модели содержатся классы, которые определяют разные объекты в вашем проекте. Это включает свойства с их основной информацией и методами для выполнения действий над этим объектом.

1) Вам действительно нужны запросы? Почему бы не использовать Entity Framework для этого? Создайте сопоставление для ваших доменных классов (либо корыто аннотаций или свободно API) и использовать DbContext для извлечения и сохранение данных, хранящихся в базе данных

2) В идеале люди создают хранилища, впрыскивают в контроллеры (Dependency Injection) , Эти репозитории могут содержать, например, что-то вроде GetPersonById(int id). Внутри этого метода было бы две вещи:

  1. Выполните действие на объект домена
  2. сохранить его в DbContext

Например:

public void Subscribe(int userID, Show show) { 
    var user = GetUserByID(userID); 
    if (!user.IsSubscribedTo(show.ShowID)) { 
     user.Subscribe(show); 
     _dbContext.SaveChanges(); 
    } 
} 

Controller -> Метод call in repository -> Выполнить действие над соответствующим объектом домена -> Сохранить изменения в базе данных

Если вам нужно что-то, что не требует мутации объекта, это еще проще:

public User GetUserByID(int id) { 
    return _dbContext.Users.FirstOrDefault(x => x.ID == id); 
} 

3) Желоба хранилищ (см. Выше) Ваш DbContext будет иметь группу DbSets, которая содержит объекты, соответствующие каждой записи данных в вашей базе данных. Резервуары Trough вы можете работать с этими объектами и управлять ими. Когда вы вызываете метод DbContext.SaveChanges(), он будет смотреть на то, что изменилось в этих списках и зафиксировать изменения в вашей базе данных.

Repository пример:

class User { 
public int ID { get; set; } 
public string Name { get; set; } 
} 

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

public interface IUserRepository { 
User GetUserByID (int id); 
bool UsernameExists (string name); 
} 

public class UserRepository : IUserRepository { 
private DatabaseContext _db; 

public UserRepository(DatabaseContext db){ 
    _db = db; 
} 

public User GetUserByID(int id) { 
    return _db.Users.FirstOrDefault(x => x.ID == id); 
} 

public User GetUserByUsername(string username) { 
    return _db.Users.FirstOrDefault(x => x.Name == username); 
} 
} 

public class UserController : Controller { 
private IUserRepository _userRepository; 

public UserController(IUserRepository userRepository) { 
    _userRepository = userRepository; 
} 

public ActionResult Details(int id){ 
    return View(_userRepository.GetUserByID(id); 
} 
} 

// Ninject settings (install this extension, you want it): 
private void AddBindings(){ 
kernel.Bind<DatabaseContext>().ToSelf().InSingletonScope(); 
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope(); 
} 
+0

Привет Я использую инфраструктуру Entity для доступа к содержимому базы данных. Я не знаю ничего о репозитории. Я слышал только о модели, просмотре и контроллере. И я знаю, что я могу использовать EF Dbcontext для извлечения данных из базы данных в контроллере и передать их для просмотра. Мне действительно нужно использовать репозиторий? Это трудная тема для изучения? Извините, это может быть немой вопрос, пожалуйста, не возражайте. – Dev

+0

@Dev: Я добавил пример использования репозитория. Репозиторий - это не что иное, как класс, который вы используете для разделения фактических классов домена на уровне сохранения. Взгляните на него и сообщите мне, если что-то неясно. –

+0

Я расскажу, что я понял. Пожалуйста, исправьте меня, если я ошибаюсь. 1) В основном мы создаем репозиторий внутри моделей с отдельным именем класса, например: myrepo- просто для лучшего понимания и структуры кода. 2) могу ли я написать все операции только в одном репозитории. Что я имею в виду, если мне нужно сделать одну операцию с таблицей 1 и другую операцию с таблицей 1 и таблицей2, другую с таблицей 3, я могу написать EF только в одном репо или мне нужно создать отдельное репо для каждой операции? – Dev

0

Вы могли бы использовать какую-то единицу работы шаблона, который Вы вводите в конструкторе контроллера с помощью инверсии управления контейнера (МОК), например autofac.

Ваш класс работы может содержать ссылку на репозитории, где вы запрашиваете/вставляете свои данные.

Грубо;

public class BackendController : Controller 
{ 
    private UnitOfWork _worker; 

    public BackendController(UnitOfWork worker) 
    { 
     this._worker = worker; 
    } 

    public ActionResult Admin() 
    { 
     var items = _worker.MyRepository.GetAll(); 
     return View(items); 
    } 
} 


public class UnitOfWork 
{ 
    private ContentRepository _contentRepository; 

    public UnitOfWork() 
    { 
    } 


    public ContentRepository MyRepository 
    { 
     get 
     { 
      if (_contentRepository != null) 
       return _contentRepository; 
      else 
       return _contentRepository = new ContentRepository(); 
     } 
    } 
} 

public class ContentRepository 
{ 
    // holds an object context and methods to retrieve and put data (EF or similar) 


} 

Вам необходимо зарегистрировать экземпляр контейнера IOC в глобальном масштабе.asax, Application_Start, например, что-то вроде этого (с помощью autofac, как МОК):

UnitOfWork worker = new UnitOfWork(); 
var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.RegisterInstance(worker).SingleInstance(); 
var container = builder.Build(); 

...

0

1) Правильно ли способ использования связанных запросов к базе данных в модели и называют, что в контроллере или представлении ?

Я бы порекомендовал не обращаться напрямую к базе данных в ваших классах моделей, так как вы должны помнить, что MVC является строго образцом слоя представления. Если вы поместите логику доступа к базе данных в своих классах моделей, то вы не сможете использовать эту функцию, например, веб-службу. Вместо этого есть логика, которая переводит ваши бизнес-объекты, определенные за пределами вашего проекта ASP.NET MVC, в классы модели ASP.NET MVC.

Это мощная архитектура архитектуры n-уровня, если вы создаете бизнес и уровень доступа к данным, тогда я мог бы написать интерфейсный интерфейс ASP.NET MVC, front-end WebForms, интерфейс WPF, Интерфейс WinForms и все они могут получать доступ к данным с использованием той же услуги. Помещая логику в классы модели ASP.NET MVC, вы фактически вынуждаете любого другого клиента дублировать эту логику снова в своих классах.