Вопрос об интерфейсах и DI? - PullRequest
0 голосов
/ 04 марта 2011

Я использую шаблон Service / Repository / EF / POCO в приложении MVC, и у меня возникла пара вопросов об интерфейсах.

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 не имеет методов моего конкретногоКатегорияСервисный класс?

Имеет ли смысл?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Используйте конкретный интерфейс для обслуживания.Если ваши сервисы можно описать с помощью общего интерфейса, вам, скорее всего, они вообще не нужны.Универсальный интерфейс часто используется для репозиториев, потому что репозитории обычно предлагают те же основные методы.

0 голосов
/ 05 марта 2011

Для себя я использую универсальный объект сеанса, который строго типа, этот класс в моем доменном проекте, который содержит все мои доменные классы. Вам следует взглянуть на этот пост: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx с использованием подхода Code-First.

Надеюсь, это поможет!

Вот мой код для моего сеанса:

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
    }
}
...