现在我正在通过SportsStore练习Sanderson的“Pro ASP.Net MVC 2 Framework”一书(第107页),我练习让我实现一个由DB存储支持的存储库模式,使用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是否有类似的机制?如果是的话,
更新 得到你的消息。令人印象深刻的模板,但我决定先尝试更简单的事情:
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没有替代品,但还有其他选择同样容易。
当我有更多时间时,我仍然计划检查你的解决方案。它似乎更复杂,但更灵活/适应性更强。
谢谢!
答案 0 :(得分:1)
椒盐脆饼 - 我们再次相遇:)
我使用亚音速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模板的副本交给您,那么您可以通过消息咆哮而无需我的消息来关注它:)