我在MVC应用程序中使用Service / Repository / EF / POCO模式,并且有几个关于接口的问题。
1)我应该为每个服务建立一个接口吗? 2)我应该为每个存储库创建一个接口吗?
或者,我应该每层有一个通用接口(IService(Of T),IRepository(Of T))。
我不明白的是控制器如何说它在构造函数中需要一个IService(Of Category)接口,我该如何在具体类中实现这些方法?
Public Class HomeController
Inherits System.Web.Mvc.Controller
Private _Service As IService(Of Category)
Public Sub New(ByVal Service As IService(Of Category))
_Service = Service
End Sub
Function Index() As ActionResult
Return View()
End Function
End Class
_Service没有我具体的CategoryService类的方法吗?
有道理吗?
答案 0 :(得分:1)
使用具体的界面进行服务。如果您的服务可以通过通用接口来描述,那么您很可能根本不需要它们。通用接口通常用于存储库,因为存储库通常提供相同的核心方法。
答案 1 :(得分:0)
对于我自己,我使用一个强类型的通用会话对象,这个类在我的域项目中包含我所有的域类。您应该使用Code-First方法查看此帖子:http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx。
希望它有所帮助!
这是我的Session类的代码:
public class EFSession : ISession
{
DbContext _context;
public EFSession(DbContext context)
{
_context = context;
}
public void CommitChanges()
{
_context.SaveChanges();
}
public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
{
var query = All<T>().Where(expression);
foreach (var item in query)
{
Delete(item);
}
}
public void Delete<T>(T item) where T : class, new()
{
_context.Set<T>().Remove(item);
}
public void DeleteAll<T>() where T : class, new()
{
var query = All<T>();
foreach (var item in query)
{
Delete(item);
}
}
public void Dispose()
{
_context.Dispose();
}
public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
{
return All<T>().FirstOrDefault(expression);
}
public IQueryable<T> All<T>() where T : class, new()
{
return _context.Set<T>().AsQueryable<T>();
}
public void Add<T>(T item) where T : class, new()
{
_context.Set<T>().Add(item);
}
public void Add<T>(IEnumerable<T> items) where T : class, new()
{
foreach (var item in items)
{
Add(item);
}
}
/// <summary>
/// Do not use this since we use EF4, just call CommitChanges() it does not do anything
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item"></param>
public void Update<T>(T item) where T : class, new()
{
//nothing needed here
}
}