我有一个Product逻辑类,它使用DbContext
来添加和插入产品。
我还有一个ProductImporter
类,它循环遍历文件中的产品列表,并调用addProduct
类中的Product
。它在事务中执行此操作,因此要么添加所有产品,要么不添加任何产品。 Pseudo在下面找到。
产品类有两个构造函数。第一个接收dbcontext,第二个初始化新的dbcontext。我使用第一个从DbContext
传递ProductImporter
的构造函数来启用事务。
var dbContext...
ImportProducts() {
Product p = new Product(dbContext);
dbContext.BeginTransaction
While(moreProducts)
p.addProduct();
End transaction
}
我的问题是:如何使用结构图来满足这两种情况:
只要应用需要添加一个产品,就会注入产品类的新实例。
在上面的Product
方法中注入ImportProducts
类,以使用相同的DbContext
。实际上,通过使用结构图替换下面的行注入产品类并使其使用与DbContext
类相同的ProductImporter
。
Product p = new Product(dbContext);
感谢。
答案 0 :(得分:0)
如果没有任何类的代码我只能推测 - 但似乎你正在混合你的数据类和逻辑/服务类 - 这会导致你难以维护和难以实现的问题(后者就是你正在经历)。
我的建议是让你的产品类只保存数据 - 完全没有逻辑。您可以使用存储库模式来执行此操作。我找到了一个示例链接:http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/
请阅读以上链接并研究模式 - 它将为您节省大量时间和麻烦。如果您足够了解该模式,请查看通用存储库,它们将为您节省更多时间,并使您的代码更容易维护。
这里的要点是你有一个单独的数据/实体/模型类,另一个用于逻辑/服务/(使用数据库)。
然后,您只需要您的存储库注入DbContext
,并且可以将存储库注入导入器。
例如:
这是未经测试的adlib代码。我只是想提供一个解决方案的例子。
public class ProductImporter
{
private readonly IProductRepository _productRepository;
public ProductImporter(IProductRepository productRepository)
{
this.__productRepository = this._productRepository;
}
public void AddProducts(IEnumerable<Product> products)
{
foreach(var product in products)
{
this._productRepository.Add(product);
}
}
...
}