Subsonic3 и ASP.NET MVC: есть что-то вроде DataContext.GetTable <T>? - PullRequest
0 голосов
/ 28 октября 2010

Прямо сейчас я прохожу свой путь через упражнение SportsStore книги Сандерсона «Pro ASP.Net MVC 2 Framework» (стр. 107), и в этом упражнении я реализую шаблон репозитория, поддерживаемый хранилищем БД с использованием LINQ-to-SQL.Я пытаюсь выяснить, как реализовать этот же репозиторий с помощью Subsonic ORM.

Основной код репозитория выглядит следующим образом:

using System.Data.Linq;
namespace DomainModel.Concrete
{
    public class SqlProductsRepository : IProductsRepository
    {
        private Table<Product> productsTable;
        public SqlProductsRepository(string connectionString)
        {
            productsTable = 
                    (new DataContext(connectionString)).GetTable<Product>();
        }

        public IQueryable<Product> Products
        {
            get { return productsTable; }
        }
    }
}

Определенная часть LINQ-To-SQLя думаю, код - это строка, включающая DataContext и GetTable.

Имеет ли Subsonic механизм, аналогичный этому?Если так,

  • как будет выглядеть код?
  • смогу ли я использовать методы, доступные в таблице System.Data.Linq, такие как:
    • InsertOnSubmit ()
    • Attach ()
    • DeleteOnSubmit ()
    • SubmitChanges ()
    • и т. Д.

ОБНОВЛЕНИЕ Получил ваше сообщение.Впечатляющий шаблон, но я решил сначала попробовать что-нибудь попроще:

using SubSonic.Repository;
namespace DomainModel.Concrete
{
    public class SqlProductsRepository : IProductsRepository
    {
        private SimpleRepository repo;
        private IQueryable<Product> products;
        public IQueryable<Product> Products
        {
            get { return products; }
        }

        public DbProductsRepository(string subsonicDatastore)
        {
            repo = new SimpleRepository(subsonicDatastore, SimpleRepositoryOptions.RunMigrations);
            this.Refresh();
        }

        public void SaveProduct(Product product) { SaveProduct(new List<Product>() { product }); }
        public void SaveProduct(IEnumerable<Product> productList)
        {
            var newProducts = from product in productList
                                 where product.ID == 0
                                 select product;
            var oldProducts = from product in productList
                                 where product.ID > 0
                                 select product;
            // If it's a new Product, just add it to the Repo
            repo.AddMany<Product>(newProducts);
            // If it's old, just update it.
            repo.UpdateMany<Product>(oldProducts);
            // Refresh internal list of products, in case table has changed.
            this.Refresh();
        }

        public void DeleteProduct(Product product) { DeleteProduct(new List<Product>() { product }); }
        public void DeleteProduct(IEnumerable<Product> productList)
        {
            repo.DeleteMany<Product>(productList);
            this.Refresh();
        }

        private void Refresh()
        {
            products = repo.All<Product>();
        }
    }
}

Насколько я могу судить, замены DataContext нет, но есть и другие варианты, которые так же просты.

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

Спасибо!

1 Ответ

1 голос
/ 28 октября 2010

Крендель - мы снова встречаемся:)

Я использую дозвуковую 3, но использую ее с общим шаблоном репозитория.это означает, что у меня есть только одна «фабрика» для раздачи сущностей.это выглядит примерно так:

public class SubSonicRepository<T> : IRepository<T> where T : new()
{
    private readonly IQuerySurface _db;

    public SubSonicRepository()
        : this(SubsonicFrameworkObjectContextPerRequest.CurrentDatabase)
    {
    }

    public SubSonicRepository(IQuerySurface db)
    {
        _db = db ?? DB.CreateDB();
    }

    // lots of stuff omitted!!

    private IQueryable<T> GetAll()
    {
        var result = _db.GetQuery<T>();
        return result;
    }

    T IRepository<T>.GetByKey(object key)
    {
        ITable tbl = _db.FindTable(typeof(T).Name);

        var result = _db.Select.From(tbl)
                               .Where(tbl.PrimaryKey.Name).IsEqualTo(key)
                               .ExecuteSingle<T>();
        return result;
    }
}

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

сейчас, если я могу передать вам копию моих шаблонов T4, то высмогу подписаться на него без моего сообщения по сообщениям:)

...