StructureMap - EF使用另一个类的变量初始化

时间:2017-08-29 13:24:04

标签: c# structuremap

我有一个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

}

我的问题是:如何使用结构图来满足这两种情况

  1. 只要应用需要添加一个产品,就会注入产品类的新实例。

  2. 在上面的Product方法中注入ImportProducts类,以使用相同的DbContext。实际上,通过使用结构图替换下面的行注入产品类并使其使用与DbContext类相同的ProductImporter

    Product p = new Product(dbContext);
    
  3. 感谢。

1 个答案:

答案 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);
        }
    }
    ...
}