Шаблон службы репозитория WCF с каркасом сущностей - PullRequest
3 голосов
/ 22 июля 2010

Мне нужен слой представления в silverlight, asp.net и т. Д., Так что все через службы wcf.У меня есть ряд сомнений в моей реализации уровня репозитория, уровня сервиса, сервисов wcf

вещей, которые я сейчас делаю

  1. У меня есть репозиторий, его нет в таблице, он создан для совокупного корня
  2. У меня есть сервисный уровень для выполнения группы действий с несколькими хранилищами
  3. Служба WCF охватывает методы на служебном уровне и уровне хранилища
  4. Объекты автоматически генерируются EF
  5. Сущности передаются и возвращаются на сервисный уровень в виде полного графа.

6. У меня есть два конкретных класса со всем хранилищем, а также служба, называемая repositorycontainer и контейнером службы.сервис

Моя база репозитория

public class RepositoryBase
    {
        public DataBaseContext _Context;
        public RepositoryContainer _RepositoryContainer;
        public RepositoryBase(RepositoryContainer repositoryContainer)
        {
            _RepositoryContainer = repositoryContainer;
            _Context = repositoryContainer.Context;
        }
        public RepositoryBase()
        {
            _RepositoryContainer = new RepositoryContainer();
            _Context = _RepositoryContainer.Context;
        }


    }

Мой контейнер репозитория

public class RepositoryContainer
    {
        public RepositoryContainer()
        {
            Context = new DataBaseContext();
        }
        public RepositoryContainer(DataBaseContext context)
        {
            Context = context;
        }
 public DataBaseContext Context
    {
        get;
        set;
    }


        public SurveyRepository _SurveyRepository;
        public SurveyRepository SurveyRepository
        {
            get
            {
                return _SurveyRepository ?? (_SurveyRepository = new SurveyRepository(this));
            }           
        }


}

Мой сервисный контейнер

 public class ServiceContainer
    {
        public ServiceContainer()
        {
            RepositoryContainer = new RepositoryContainer();
        }
        public ServiceContainer(RepositoryContainer container)
        {
            RepositoryContainer = container;
        }


        public RepositoryContainer RepositoryContainer
        {
            get;
            set;
        }
   public SurveyService _SurveyService;
        public SurveyService SurveyService 
        {
            get
            {
                return _SurveyService?? (_SurveyService= new SurveyService(this));
            }           
        }


    }

Для выполнения операции я простосоздайте RepositoryContainer или ServiceContainer

, затем вызовите

RepositoryContainer.Repository.Method()
ServiceContainer.Service.Method()

Мои сомнения:

  1. t контейнер службы / репозитория в порядке?

  2. У меня уже есть сервисный уровень, так как у меня есть сервис wcf, что я называю текущим сервисным оберткой сервисного уровня или что-то в этом роде?

  3. Мне нужно самому вызывать методы репозитория, например: GetCategory () и т. Д., А также все методы на уровне сервисов. Поэтому мне нужно обернуть оба метода и сервис в сервис wcf, это нормально?

  4. Где делать кеширование?поскольку я использую EF, я думаю, что есть какой-то способ использовать провайдер кеша с EF,

1 Ответ

3 голосов
/ 25 июля 2010

Этот контейнер службы / репозитория в порядке?

Класс RepositoryContainer содержит "SurveyRepository" - но не должен ли SurveyRepository быть экземпляром RepositoryContainer?То же самое для ServiceContainer и "SurveyService".Для меня было бы больше смысла, если бы они были (хотя трудно точно прокомментировать, не будучи более знакомыми с проектом).

Тогда у вас будет: ServiceContainer SurveyService = new ServiceContainer(..);

Как у вас естьу меня складывается впечатление, что SurveyService - это конкретная бизнес-концепция, но она заключена в более общий тип (ServiceContainer);то же самое для SurveyRepository / RepositoryContainer.

Это нарушит SRP , Общий принцип закрытия и, вероятно, Общий принцип повторного использования .

Я не уверен, что думают другие, но я также не фанат именования экземпляров после их типов (кроме самых простых из senarios - что это не так): public SurveyRepository SurveyRepository Имя типа должно отражать то, чтотип (или делает), который будет отличаться от конкретного его экземпляра (например, ServerContainer и ServeyService).

У меня уже есть уровень службы, так как у меня есть служба wcf, которую я называютекущий сервисный обертка сервисного уровня или что-то?

и

Так что мне нужно изменить имя моего сервисного (BL) слоя на что-то сервисное обертка или что-то, затем в wcfуровень обслуживания Я определяю методы в репозитории и сервисе, затем просто вызываю соответствующие методы в сервисе, репозиторий

Обычно любой BL многократного использования должен находиться в автономном режиме.пакет и не заключенный (например, «жестко запрограммированный») в сервисный уровень или сервис WCF и т. д. Затем вы создадите конечные точки сервиса, расположенные поверх BL.Если у вас есть бизнес-транзакции, которые охватывают разные бизнес-объекты в разных пакетах , то вам нужно поместить этот более высокий уровень оркестровки где-то выше - я думаю, это может пойти на уровне сервиса, но это не тривиальныйчто нужно сделать, вам нужно тщательно продумать, в чем заключаются определенные обязанности.

Если транзакция обрабатывает различные бизнес-объекты в одном и том же пакете 1040 *, тогда оркестровка намного проще и может быть выполнена с помощьюдругой тип BL, предназначенный для выполнения этой работы, который будет частью этого пакета, а не на уровне обслуживания.

Что касается именования - перейдите к доске и сопоставьте все, а затем переименуйте все, как требуется.По крайней мере, с помощью одного связного обзора вы сможете разобраться во всем.

BL-пакеты должны быть названы в соответствии с тем, что они делают - с точки зрения бизнеса.Службы WCF, которые обертывают их, должны иметь подходящее имя, которое может включать ссылку на тип используемого канала (JSON, WebService и т. Д.).Поскольку вы можете изменить канал, который служба WCF использует при помощи конфигурации (если служба спроектирована правильно), это может быть не очень хорошей идеей, но если предположить, что это не так, то может помочь дополнительная ясность.

Эти статьиможет помочь:

Мне нужно самому вызывать методы репозитория, например: GetCategory () и т. Д., А также все методы на уровне сервисов, поэтому мне нужно обернуть и методы, и сервис в сервис wcf,Это нормально?

Завершение службы в службу звучит немного подозрительно.Только внешние абоненты должны проходить через сервисы - при условии, что сервисы предназначены для предоставления BL сторонним лицам.Внутренние абоненты должны знать, какой метод следует вызывать (поскольку он является внутренним), возможно, это тот же метод, который предоставляется службой.

Где выполнять кэширование?поскольку я использую EF, я думаю, что есть какой-то способ использовать провайдер кеша с EF

Я не знаю, можете ли вы кешировать в EF4, но меня это не удивит, если вы сможете. Где делать кеширование? - Это зависит от того, в каком месте пробита бутылка, которую вы пытаетесь устранить.

В вашем RepositoryContainer поле _SurveyRepository является открытым - не должно ли оно быть приватным? В противном случае, почему свойство SurveyService доступно только для чтения (get)?

public SurveyRepository _SurveyRepository;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...