ASP.Net MVC и репозиторий - PullRequest
       21

ASP.Net MVC и репозиторий

1 голос
/ 11 сентября 2010

У меня есть 4 разные модели, из которых я извлекаю информацию для сетки в виде.Этот фрагмент кода является частью моего контроллера для моего действия индекса.У каждой модели есть репозиторий, partRepository, parts_comboRepository, vendor_partRepository и Manufacturer_partRepository, и я использую эти репозитории для сбора данных для моих объединений.

var nss_part_combo = 
    from o in parts_comboRepository.FindAll_Parts_Combos()
        join parts in partRepository.FindAll_Parts()
        on o.FK_Parts_ID_PARTS equals parts.ID_PARTS into joined_parts
     from parts in joined_parts.DefaultIfEmpty()
        join vendor_parts in vendor_partRepository.FindAllVendor_Parts()
        on o.FK_Vendor_Parts_ID_VENDOR_PARTS equals vendor_parts.ID_VENDOR_PARTS into joined_vendor_parts
     from vendor_parts in joined_vendor_parts.DefaultIfEmpty()
        join manufacturer_parts in manufacturer_partRepository.FindAllManufacturer_Parts()
        on o.FK_Manufacturer_Parts_ID_MANUFACTURER_PARTS equals manufacturer_parts.ID_MANUFACTURER_PARTS into joined_manufacturer_parts
     from manufacturer_parts in joined_manufacturer_parts.DefaultIfEmpty()
     select new NSS.ViewModel.Part_ComboViewModel
     {
         ...
     };

return View(new GridModel(part_combo));

При запуске я получаю сообщение об ошибке в разных контекстах.Я исправил проблему, объявив сущность в верхней части моего контроллера и используя ее вместо объектов репозитория, чтобы получить все мои IEnumerables для объединений.Это хороший способ сделать это?Я чувствую, что как-то отклонился от того, что я должен делать, и создал хак, чтобы исправить мою проблему.Какова была бы лучшая практика для решения этой проблемы?

1 Ответ

0 голосов
/ 11 сентября 2010

Я использую этот подход:

// I'm using top level class - UnitOfWork which is Abstract factory for my Data access layer 
// Unit of work is the only class which can get me instances of repositories
// It is also the holder for ObjectContext
public class UnitOfWork : IUnitOfWork, IDisposable
{
    private ObjectContext _context;

    public UnitOfWork(string connectionString)
    {
        if (String.IsNullOrEmpty(connectionString))
        {
            throw new ArgumentNullException("connectionString");
        }

        _context = new ObjectContext(connectionString);
    }

    private IRepository<Post> _postRepository;

    public IRepository<Post> PostRepository
    {
       get
       {
           if (_postRepository == null)
           {
              // Repositories are defined in the same assembly as UnitOfWork and have internal contructor. 
               _postRepository = new PostRepository(_context);
           }

           return _postRepository;
       }
    }

    // Other repositories

    // Dispose()

    // Unit of work saves changes made to entities from all repositories.
    public void Flush()
    {
       _context.SaveChanges();
    }
}

В зависимости от сложности приложения UnitOfWork используется бизнес-уровнем для внедрения зависимостей или напрямую контроллером для внедрения зависимостей. Вы должны создать собственную ControllerFactory и использовать IoC для ее внедрения. UnitOfWork определен в IoC, для которого создается экземпляр времени жизни HTTP-запроса.

...