Прямо сейчас я прохожу свой путь через упражнение 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 нет, но есть и другие варианты, которые так же просты.
Я все еще планирую проверить ваше решение, когда у меня будет больше времени.Это кажется более сложным, но гораздо более гибким / адаптируемым.
Спасибо!