IR 저장소는 무엇이며 무엇에 사용됩니까?
IR 저장소란 무엇입니까?왜 그것이 사용되는가, 간단하고 간단한 예들은 해롭지 않을 것입니다.
MVC는 우려의 분리를 촉진하지만, MVC 수준에서 멈추지 않습니다.
데이터 액세스는 그 자체로 문제가 됩니다.MVC의 Mbit, 즉 모델에서 수행해야 합니다.모델을 어떻게 구성하느냐는 여러분에게 달려 있지만, 사람들은 대개 시도되고 테스트된 패턴을 따릅니다(왜 바퀴를 재창조하는가?).리포지토리 패턴이 현재 표준입니다.그러나 변형이 거의 개발자 수만큼 많기 때문에 간단한 공식을 기대하지 마십시오.
IR 저장소는 사용자가 생성하는 인터페이스일 뿐 MVC 또는 ASP의 일부가 아닙니다.NET 또는 .NET).실제 구현에서 저장소를 "분리"할 수 있습니다.디커플링은 당신의 코드를 의미하기 때문에 좋습니다.:
- 코드가 훨씬 더 재사용 가능합니다.이것은 아주 좋습니다.
- 코드는 제어 반전(또는 종속성 주입)을 사용할 수 있습니다.이것은 여러분의 걱정을 잘 구분하는 데 좋습니다.유닛 테스트가 가능하기 때문에 특히 좋습니다...
- 코드를 유닛 테스트할 수 있습니다.이것은 복잡한 알고리즘이 있는 대규모 프로젝트에서 특히 유용합니다.그것은 당신이 작업하고 있는 기술과 당신이 소프트웨어에서 모델링하려는 도메인에 대한 당신의 이해를 높여주기 때문에 어디서나 좋습니다.
- 코드는 일반적인 패턴에 따라 모범 사례를 기반으로 작성됩니다.이것은 유지보수를 훨씬 쉽게 해주기 때문에 좋습니다.
따라서 여러분에게 디커플링을 판매한 결과, IR 저장소는 여러분이 만들고 여러분의 저장소를 상속받는 인터페이스라는 것이 질문에 대한 답입니다.신뢰할 수 있는 클래스 계층 구조를 제공합니다.
일반적으로 일반 IR 저장소를 사용합니다.
IR 저장소
여기서 Tentity는 하나의 실체입니다.사용하는 코드는 다음과 같습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 Save();
}
}
이 인터페이스의 구체적인 구현은 다음과 같습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using Wingspan.Web.Mvc;
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 Save()
{
db.SubmitChanges();
}
#endregion
}
}
이를 통해 다음과 같이 쓸 수 있습니다.
SqlRepository<UserCourse> UserCoursesRepository = new SqlRepository<UserCourse>(db);
여기서 db는 서비스에 주입된 DataContext 인스턴스입니다.
UserCoursRespository를 사용하여 서비스 클래스에서 다음과 같은 메서드를 작성할 수 있습니다.
public void DeleteUserCourse(int courseId)
{
var uc = (UserCoursesRepository.Query.Where(x => x.IdUser == UserId && x.IdCourse == courseId)).Single();
UserCoursesRepository.Delete(uc);
UserCoursesRepository.Save();
}
이제 컨트롤러에 다음과 같이 기록할 수 있습니다.
MyService.DeleteUserCourse(5);
MyService.Save();
이러한 패턴으로 인해 앱 개발은 매우 단순한 컨트롤러로 이어지는 조립 라인에 가까워집니다.조립 라인의 모든 부분은 다른 모든 것과 독립적으로 테스트될 수 있으므로 버그가 싹트기 시작합니다.
만약 이것이 길고 다루기 힘든 대답이라면, 그것은 진짜 대답이 다음과 같기 때문입니다.
Steven Sanderson의 책 Pro ASP를 구입합니다.NET MVC 2 프레임워크 및 MVC에서 사고하는 법을 배웁니다.
안 안IRepository
리포지토리 패턴을 구현할 때 지정하는 인터페이스입니다.@Brian Ball이 말했듯이, 그것은 의 일부가 아닙니다.NET 사용자가 생성하는 인터페이스입니다.
리포지토리 패턴을 사용하는 개발자는 구현을 위한 인터페이스 사용을 널리 권장합니다.예를 들어, 제가 지금 개발 중인 애플리케이션에는 5개의 저장소가 있습니다.특정 4개 및 일반 1개.각 시스템은 다음 시스템에서 상속됩니다.IRepository
구현의 차이로 인해 향후 문제가 발생하지 않도록 보장합니다.
코드 예제에 대해서는 다음을 시도해 보겠습니다.
interface IRepository<T> where T : class {
IQueryable<T> Select();
}
일반 리포지토리로 구현:
public class Repository<T> : IRepository<T> where T : class {
public IQueryable<T> Select() {
return this.ObjectContext.CreateObjectSet<T>();
}
}
전문 저장소로 구현:
public class EmployeeRepository : IRepository<Employee> {
public IQueryable<Employee> Select() {
return this.ObjectContext.Employees;
}
}
다 둘다Repository<T>
그리고.EmployeeRepository
IRepository
그러나 쿼리를 약간 다르게 수행합니다.일반 리포지토리는 T 개체 집합을 만들어야만 작업을 수행할 수 있습니다.
을 명심하세요.Repository<T>
반면, 는 인터페이스에 고정되어 있습니다.EmployeeRepository
보다 복잡한 논리를 구현하기 위해 보다 전문적인 방법을 구현할 수 있습니다.
이것이 당신에게 조금이나마 도움이 되길 바랍니다.
IRepository
에 정의된 유형이 아닙니다.넷 프레임워크.일반적으로 이름이 지정된 인터페이스를 볼 때 프로그램은 리포지토리 패턴(https://web.archive.org/web/20110503184234/http ://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx )을 사용합니다.일반적으로 사람들이 이 패턴을 사용할 때, 그들은 모든 리포지토리가 준수하는 인터페이스를 만들 것입니다.이렇게 하면 많은 이점이 있습니다.몇 가지 이점은 코드 디커플링 및 장치 테스트입니다.
또한 IoC(http://en.wikipedia.org/wiki/Inversion_of_control )를 사용하여 이를 활용할 수 있도록 이 작업을 수행하는 것이 일반적입니다.
리포지토리는 개체의 메모리 컬렉션처럼 기본적이고 임의적인 데이터 저장소를 나타내는 추상화입니다.
이 정의는 기본 데이터 저장소 및 임의 데이터 저장소를 나타내는 메모리의 개체 모음으로서 일반적인 관행 및 시스템 제한으로 인해 보다 실용적인 형태로 변형됩니다.후드 아래에서 저장소는 데이터베이스, 플랫 파일, 메모리 내 객체 모음 또는 기타 상상할 수 있는 모든 것에 연결될 수 있습니다.리포지토리의 사용자는 상관하지 않습니다.
소안IRepository
API 코드가 클라이언트 코드가 리포지토리와 상호 작용하는 방식을 정의하는 인터페이스 계약입니다.여기에는 다음과 같은 매우 일반적인 리포지토리 계약의 예와 같이 계약 추가, 업데이트, 삭제 및 가져오기가 포함됩니다.
public interface IRepository<TEntity> where TEntity : class
{
List<TEntity> GetAll();
void Add(TEntity entity);
void Delete(TEntity entity);
void Save();
}
하지만 몇 가지 이유로 다른 인터페이스를 사용하는 것을 선호합니다.
첫째, 일반적으로 리포지토리를 단독으로 사용하는 것이 아니라 작업 패턴 단위와 함께 사용하게 되므로 리포지토리에 Save() 메서드가 없어야 합니다.그것은 아마도Update(T entity)
방법 - 하지만 왜죠?저장소에서 수신하는 개체는 개체 자체에 대한 참조를 검색했기 때문에 모든 종류의 개체 컬렉션에서 수신하는 다른 개체와 마찬가지로 자동으로 업데이트/업데이트됩니다.TEntity
이다.Person
객체, 그리고 당신은 사람 "척"을 얻고, 당신은 그의 성을 "바토프스키"에서 "카마이클"로 바꾸면, 저장소는 아마도 이미 해당 엔티티를 업데이트했을 것입니다.만약 이것이 당신의 마음속에 미약하게 보인다면, 그것을 실행하는 것은 아무 문제가 없습니다.Update(T entity)
방법).
둘째, 대부분의 리포지토리는 연결되지 않은 환경을 처리할 수 있어야 합니다.솔루션에 이 요구 사항이 없는 경우에도 연결되지 않은 시나리오를 처리하는 인터페이스를 생성하여 구현하지 않은 상태로 둘 수 있습니다.이제 당신은 미래를 위한 준비가 되었습니다.
마지막으로, 우리의 계약은 저장소의 본질에 더 의미가 있습니다. 즉, 임의의 데이터 저장소를 나타내는 메모리의 개체 모음이며, 연결되지 않은 개체를 나타낼 수 있습니다.
public interface IRepository<TEntity> where TEntity : class
{
List<TEntity> GetAll();
List<TEntity> Get(Func<TEntity, bool> where);
void Insert(TEntity entity);
void Insert(IEnumerable<TEntity> entities);
void Remove(TEntity entity);
void Remove(IEnumerable<TEntity> entities);
void SyncDisconnected(TEntity entity, bool forDeletion = false);
void SyncDisconnected(IEnumerable<TEntity> entities, bool forDeletion = false);
}
엔티티에 , 이를 "" "" "" "" " ""라고 부릅니다DomainObject
그리고 당신은 그것을 줍니다.Id
필드에서 다음을 수행할 수 있습니다.
public interface IRepository<TEntity> where TEntity : DomainObject
{
TEntity GetById(object Id);
List<TEntity> GetAll();
List<TEntity> Get(Func<TEntity, bool> where);
void Insert(TEntity entity);
void Insert(IEnumerable<TEntity> entities);
void Remove(TEntity entity);
void Remove(IEnumerable<TEntity> entities);
void SyncDisconnected(TEntity entity, bool forDeletion = false);
void SyncDisconnected(IEnumerable<TEntity> entities, bool forDeletion = false);
}
옵션 매개 변수가 마음에 들지 않는 경우forDeletion
삭제된 개체를 동기화할 수 있는 메서드를 추가할 수도 있습니다.
void SyncDisconnectedForDeletion(TEntity entity);
이 작업을 수행해야 하는 이유는 대부분의 경우 삭제를 위해 연결되지 않은 개체를 동기화하는 것은 추가 또는 수정을 위해 연결되지 않은 개체를 동기화하는 것과 호환되지 않기 때문입니다.(해보세요.스토어에 대한 삭제 요구 사항은 추가 또는 수정 요구 사항과 크게 다릅니다.따라서, 인터페이스는 구현이 둘 사이를 구별할 수 있도록 계약을 정의해야 합니다.
Entity Framework와 같은 기본 데이터 저장소에 대한 기타 추상화를 포함하여 연결되거나 연결되지 않은 기본 데이터 저장소의 모든 리포지토리에 대해 이 인터페이스를 구현할 수 있습니다.
언급URL : https://stackoverflow.com/questions/4528712/what-is-a-irepository-and-what-is-it-used-for
'programing' 카테고리의 다른 글
스토리보드에서 UIScrollView를 사용하는 방법 (0) | 2023.05.13 |
---|---|
특정 조건을 세고 합산하는 판다 (0) | 2023.05.13 |
Windows 양식에서 양식 모달을 만들려면 어떻게 해야 합니까? (0) | 2023.05.13 |
wpf에서 MVVM이 있는 ComboBox의 SelectionChanged 이벤트를 처리하는 방법은 무엇입니까? (0) | 2023.05.13 |
문자열에서 선행 공백을 모두 제거하려면 어떻게 해야 합니까? - swift (0) | 2023.05.13 |