Как абстрагировать контекст данных сущностей в C # - PullRequest
3 голосов
/ 26 марта 2012

В моем приложении я создал DAL с классом Repository. Репозиторий использует набор классов EF как Контекст данных .

Я хотел бы создать абстракцию, чтобы можно было использовать несколько Контекст данных с одним и тем же хранилищем . Я использую следующий код для инициализации контекста (ProductEntities - это контекст EF):

public class ProductRepository : IProductRepository
{
     ?type? _productEntitiesContext;

     public productRepository()
     {
         _productEntitiesContext = new ProductEntities();
     }

     public productRepository(?type? productContext)
     {
         _productEntitiesContext = productContext;
     }
}

Но я не знаю тип _productEntitiesContextproductContext). ProductEntities наследуется от ObjectContext.

Чтобы добиться абстракции, я всегда использую интерфейсы, я не знаю, могу ли я использовать ObjectContext, поскольку это класс.

Кто-нибудь знает, достижима ли моя цель?

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

Как то так?

public class ProductRepository<T> : IProductRepository where T: new()
{
     T _productEntitiesContext;

     public productRepository()
     {
         _productEntitiesContext = new T();
     }

     public productRepository(T productContext)
     {
         _productEntitiesContext = productContext;
     }
}
1 голос
/ 26 марта 2012

Если вам нужен дополнительный уровень абстракции, вы могли бы рассмотреть единицу работы и IoC, есть много примеров использования stackoverflow. Примеры для linq-to-sql также применимы к платформе Entity. Я лично реализовал это в нескольких проектах, используя Entity Framework. Если вам интересно, стоит прочитать о единицах работы и IoC в ссылках ниже.

DataContext, хранилища и единицы работы

http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

http://blogs.msdn.com/b/kylemc/archive/2011/08/18/unit-testing-a-wcf-ria-domainservice-part-2-the-repository-pattern.aspx

надеюсь, это поможет.

1 голос
/ 26 марта 2012

Не уверен, что является проблемой в жестком кодировании ProductEntities здесь - ProductRepository в любом случае кажется, что это реализация для конкретного продукта.

Если вы хотите внедрить ProductEntities в свой репозиторий без учета зависимостей, вы можете создать интерфейс маркера, такой как IProductEntities, и реализовать его в ProductEntities

public interface IProductEntities { }

public partial class ProductEntities : IProductEntities { }

Помните, что хотя ProductEntities является сгенерированным классом, вы все равно можете добавить к нему код, потому что он является частичным (в качестве примечания, если он не был частичным, тогда вы могли бы просто унаследовать его)

Возможно, вы можетехотите добавить некоторые методы в интерфейс IProductEntities, если вы действительно думаете о переключаемых контекстах данных.Хотя я сомневаюсь, что будет необходимость менять контекст, и я не уверен, кто будет предоставлять альтернативную реализацию.

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

...