ASP.NET MVC Templates

I am new to MVC, but after playing with it (MVC 3 / Razor) I am connected.

I have a few questions:

1) What is the best or most widely used pattern for developing MVC applications? Repository, DDD, UOW?

2) I am using Entity Framework 4, so can someone explain to me or point to a good source that will explain the w / EF4 repository template? Does EF4 work as a business layer and data access layer? Is the repository template even useful?

3) Also, the last question, can someone explain all the relationships between the controller, model and view? I get the basics, but maybe a little more deep in the correct way to use it. View models. Let's say I have a view that displays information about the client, and one that edits it, should I have a view model and an editing model, or can I pass it on?

4) Examples

Thanks for the help ahead,
$ ("Sam")

** EDIT **

I'm on the right track here:

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index(ByVal id As Integer) As ActionResult
        Return View(New HomeModel)
    End Function

    <HttpPost()> _
    Function Index(ByVal Model As HomeModel) As ActionResult
        Return View(Model)
    End Function

End Class

Public Class HomeModel
    Private _Repository As IRepository(Of Customer)

    Public Property Customer As Customer

    Public Sub New()

    End Sub

    Public Sub New(ByVal ID As Integer)
        _Repository = New CustomerRepository
        Customer = _Repository.GetByID(ID)
    End Sub

End Class

Public Interface IRepository(Of T)
    Function GetByID(ByVal ID As Integer) As T
    Sub Add(ByVal Entity As T)
    Sub Delete(ByVal Entity As T)

End Interface

Public Class CustomerRepository
    Implements IRepository(Of Customer)

    Public Sub Add(ByVal Entity As Customer) Implements IRepository(Of Customer).Add

    End Sub

    Public Sub Delete(ByVal Entity As Customer) Implements IRepository(Of Customer).Delete

    End Sub

    Public Function GetByID(ByVal ID As Integer) As Customer Implements IRepository(Of    Customer).GetByID
        Return New Customer With {.ID = ID, .FirstName = "Sam", .LastName = "Striano"}
    End Function
End Class

Public Class Customer
    Public Property ID As Integer
    Public Property FirstName As String
    Public Property LastName As String
End Class
+2
source share
4 answers

I use shared repositories that get an instance in a service class (using Injection Dependency with Ninject).

:

  • , .

  • , ViewModel, , MyViewModel.

. "" :

namespace ES.eLearningFE.Areas.Courses.Controllers
{
    public partial class CourseController : Controller
    {
        ICourseDisplayService service;
        public CourseController(ICourseDisplayService service)
        {
            this.service = service;
        }

        public virtual ActionResult Display(int CourseId, int StepOrder, string PupilName, string TutorName)
        {
            service.CourseId = CourseId;
            service.StepOrder = StepOrder;
            service.PupilName = PupilName;
            service.TutorName = TutorName;
            if (Request.IsAjaxRequest())
            {
                return PartialView(service.ViewModel);
            }
            else
            {
                return View(service.ViewModel);
            }
        }

    }
}

ViewModel ( , List < > ).

. :

namespace ES.eLearning.Domain.Services.Courses
{
    public class SqlCourseDisplayService : ICourseDisplayService
    {
        DataContext db;

        public SqlCourseDisplayService(DbDataContextFactory contextFactory)
        {
            db = contextFactory.Make();
            CoursesRepository      = new SqlRepository<Course>(db);
            StepsRepository        = new SqlRepository<CourseStep>(db);
            StepLinksRepository    = new SqlRepository<StepLink>(db);
            UserCoursesRepository  = new SqlRepository<UserCourse>(db);
            CourseTutorsRepository = new SqlRepository<CourseTutor>(db);
            UsersRepository        = new SqlRepository<User>(db);
        }
        #region ICourseDisplayService Members

        public ViewModels.CourseDisplayVM ViewModel
        {
            get
            {
                return new ViewModels.CourseDisplayVM
                {
                    CourseId = this.CourseId,
                    CourseName = this.Course.Name,
                    Steps = this.Steps,
                    ActiveStepIndex = this.ActiveStepIndex,
                    CurrentStepIndex = this.CurrentStepIndex,
                    Pupil = new UserDto { UserId = this.PupilId, UserName = this.PupilName },
                    Tutors = this.GetTutors(this.CourseId),
                    Tutor = tutorName == null ? null : new UserDto { UserName = this.TutorName, UserId = this.TutorId}
                };
            }
        }

        #region Entities

        int courseId;
        public int CourseId
        {
            get
            {
                if (courseId == 0) throw new ApplicationException("Invalid Course Id!");
                return courseId;
            }
            set
            {
                if (value == 0) throw new ApplicationException("Invalid Course Id!");
                try
                {
                    Course   = (from c in CoursesRepository.Query where c.CourseId == value select c).First();
                    Steps    = Course.CourseSteps.ToList();
                    courseId = value;
                }
                catch {throw new ApplicationException("No Course found for Course Id: " + value);}
            }
        }

        public Data.Course Course { get; private set; }

        public int StepOrder { get; set; }

        public List<Data.CourseStep> Steps { get; private set; }

        public int ActiveStepIndex
        {
            get
            {
                if (PupilName == null)
                {
                    throw new ApplicationException("Pupil not set!");
                }
                if (CourseId == 0)
                {
                    throw new ApplicationException("Course not set!");
                }
                try
                {
                    var x = (from uc in UserCoursesRepository.Query where (uc.IdCourse == CourseId) && (uc.UserName == PupilName) select uc).First();
                    return x.ActiveStepIndex;
                }
                catch { throw new ApplicationException("Could not get Active Step!"); }
            }
        }

        #endregion

        #region Users

        string tutorName;
        public string TutorName
        {
            get 
            {
                if (tutorName == null) throw new ApplicationException("Invalid call to get Tutor Name [Null Tutor Name]!");
                return tutorName; 
            }
            set
            {
                tutorName = value;
                TutorId = (Guid)Membership.GetUser(tutorName).ProviderUserKey;
            }
        }

        public Guid TutorId { get; set; }

        string pupilName;
        public string PupilName
        {
            get { return pupilName; }
            set
            {
                pupilName = value;
                PupilId = (Guid)Membership.GetUser(pupilName).ProviderUserKey;
            }
        }

        public Guid PupilId { get; set; }

        #endregion

        #region Utility Properties

        public int CurrentStepIndex { get; set; }
        public int StepCount
        {
            get
            {
                return Steps == null ? 0 : Steps.Count();
            }
        }

        #endregion

        #region Private Utilities

        private List<UserDto> GetTutors(int CourseId)
        {
            return (from ct in CourseTutorsRepository.Query join u in UsersRepository.Query
                    on ct.TutorName equals u.UserName
                    where (ct.CourseId == courseId) 
                    select new UserDto { UserName = ct.TutorName, UserId = u.UserId }).ToList();
        }

        #endregion

        #region Repositories

        private IRepository<Course> CoursesRepository
        {
            get;
            set;
        }

        private IRepository<CourseStep> StepsRepository
        {
            get;
            set;
        }

        private IRepository<StepLink> StepLinksRepository
        {
            get;
            set;
        }

        private IRepository<UserCourse> UserCoursesRepository
        {
            get;
            set;
        }

        private IRepository<CourseTutor> CourseTutorsRepository
        {
            get;
            set;
        }

        private IRepository<User> UsersRepository
        {
            get;
            set;
        }

        #endregion

        #endregion
    }
}

, , , ... ( ) .

, , :

namespace ES.eLearning.Domain
{
    public class SqlRepository<T> : IRepository<T> where T : class
    {
        DataContext db;
        public SqlRepository(DataContext db)
        {
            this.db = db;
        }

        #region IRepository<T> Members

        public IQueryable<T> Query
        {
            get { return db.GetTable<T>(); }
        }

        public List<T> FetchAll()
        {
            return Query.ToList();
        }

        public void Add(T entity)
        {
            db.GetTable<T>().InsertOnSubmit(entity);
        }

        public void Delete(T entity)
        {
            db.GetTable<T>().DeleteOnSubmit(entity);
        }

        public void Attach(T entity)
        {
            db.GetTable<T>().Attach(entity);
        }

        public void Save()
        {
            db.SubmitChanges();
        }

        #endregion
    }
}

IRepository:

namespace Wingspan.Web.Mvc
{
    public interface IRepository<TEntity> where TEntity : class
    {
        List<TEntity> FetchAll();
        IQueryable<TEntity> Query {get;}
        void Add(TEntity entity);
        void Delete(TEntity entity);
        void Attach(TEntity entity);
        void Save();
    }
}
+1

. ; :

www.asp.net; /, . ,

, EF4/Repository. blogpost .

+1

1) , , controll .

2) , , , , . . , , foreach, . , , - .

3) , viewmodels. -, viewmodels, - , , , . "" .

+1

, . Injection Dependency. Dependency Injection Unit Testing , . http://ninject.org/ Dependecy .NET.

View Models must contain the displayed data and transfer this data from the controller to the view. If you want to edit and display customer information, see this

+1
source

All Articles