关于接口和DI的问题?

时间:2011-03-04 18:52:23

标签: asp.net-mvc repository-pattern service-layer

我在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类的方法吗?

有道理吗?

2 个答案:

答案 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
    }
}