Где находится мой код CRUD LINQ?ASP.NET MVC - PullRequest
5 голосов
/ 25 ноября 2010

В настоящее время я использую инфраструктуру ASP.NET MVC для проекта (в основном, в первый раз)

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

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

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

У меня в данный момент есть такой код в контроллере, и я передаю данные, которые я получаю в виде ..

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

если нет, то как мне добавить мою модель данных linq2sql для включения этого вида кода?

Спасибо

Daniel

Ответы [ 4 ]

5 голосов
/ 25 ноября 2010

Чтобы добавить то, что сказал @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));
}
2 голосов
/ 25 ноября 2010

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

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

0 голосов
/ 25 ноября 2010

Вот пример того, как реализовать шаблон репозитория

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

0 голосов
/ 25 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...