5

настоящее время я использую рамки ASP.NET MVC в проекте (в значительной степени мой первый раз)Где мой код CRUD LINQ Go? ASP.NET MVC

Я использую Linq2SQL в моей модели данных ..

Где я должен иметь этот вид кода:

var entries = from e in db.sometable select e; 

я в настоящее время это любопытное код в контроллере и передать данные я получаю в поле зрения ..

это нормально?

если нет, то каким образом я могу привязать к своей модели linq2sql datamodel этот вид кода?

Благодаря

Daniel

ответ

2

Это общепринятая использовать Repository шаблон для MVC. Как правило, вы определяете интерфейс, например, IProducts, а затем реализуете этот интерфейс, вызывая код linq2sql. Ваш контроллер примет этот интерфейс как параметр для конструктора, так что он зависит от этого интерфейса, а не от конкретного класса. Использование инжектора зависимостей, такого как Ninject, позволит вам предоставить конкретную реализацию интерфейса конструктору. Это позволяет тестировать устройства в вашем веб-приложении, а также повышает гибкость.

Есть действительно хорошая книга, Pro ASP.NET MVC 2 Framework, которая объясняет все это. Я сейчас читаю его, и мне просто нравится.

0

Хорошо, что у Linq есть вопросы в методах контроллера.

Если мы говорим о разделении опасений, идея заключается в том, что ваш уровень данных (в данном случае код репозитория (?), Который снабжает вас db.sometable), отделяет ваш логический код (в этом случае методы контроллера) от хранилище данных.

Вы запрашиваете данные слой, а не базу данных, поэтому вы можете изменить базовое хранилище данных, и ваш код контроллера по-прежнему будет работать.

Некоторые утверждают, что лучше переместить столько логического кода, сколько вы можете выйти из контроллеров и в код модели (см. the first answer here), но это зависит от того, как далеко вы хотите идти.

0

Вот пример того, как реализовать repository pattern

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

5

Чтобы добавить, что сказал @Poco, вот пример:

В Foo.Common.Repositories (внутри Foo.Common проекта):

public interface IRepository<T> 
{ 
    IEnumerable<T> GetAll(); 
    void Update(T entity); 
    void Add(T entity); 
    void Delete(T entity); 
    void Save(); 
} 

public interface IUserRepository : IRepository<User> 
{ 
    void GetByCredentials(string username, string password); 
} 

Внутри Foo.Data.Repositories (внутри Foo.Data проекта):

public class UserRepository 
{ 
    // ... other methods/properties snipped. 

    public IEnumerable<User> GetAll() 
    { 
     // Where this.Users would be L2Sql or Code-First... or some other ORM. 
     return from u in this.Users orderby u.Name select u; 
    } 
} 

Тогда внутри вашего фактического Foo.Web:

public class UserController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public UserController(IUserRepository userRepository) 
    { 
     this.userRepository = userRepository; 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult List() 
    { 
     var users = this.userRepository.GetAll(); 
     return this.View(users); 
    } 
} 

И внутри вашего Global.asax вы бы Ninject или какой-либо другой контейнер IoC для решения IUserRepository:

public static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IUserRepository>().To<UserRepository>(); 
} 

protected void Application_Start() 
{ 
    var kernel = new StandardKernel(); 

    AreaRegistration.RegisterAllAreas(); 

    MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters); 
    MvcApplication.RegisterRoutes(RouteTable.Routes); 
    MvcApplication.RegisterServices(kernel); 

    // I'm using MVC3 here: 
    DependencyResolver.SetResolver(new NinjectResolver(kernel)); 
}