StructureMap - EF初始化可变从另一个类

问题描述:

我有一个使用DbContext添加和插入产品产品逻辑类。StructureMap - EF初始化可变从另一个类

我还有一个ProductImporter类,它循环访问文件中的产品列表并调用Product类中的addProduct。它在交易中这样做,因此所有产品都添加或没有。伪在下面。

产品类有两个构造函数。第一个接受dbcontext,第二个初始化一个新的dbcontext。我使用第一个构造函数来传递ProductImporter中的DbContext以启用事务。

var dbContext... 

ImportProducts() { 

    Product p = new Product(dbContext); 

    dbContext.BeginTransaction 


    While(moreProducts) 

     p.addProduct(); 


    End transaction 

} 

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

  1. 注入产品类的新实例,每当应用程序需要添加一个产品。

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

    Product p = new Product(dbContext); 
    

感谢。

没有对任何类的,我只能推测代码 - 但似乎你是混合数据类和逻辑/服务类 - 这可以引领你进入难以维持和难以落实的问题(后者是什么你正在经历)。

我的建议是让你的产品类只保存数据 - 没有逻辑可言。您可以使用存储库模式来执行此操作。我找到了一个链接,给你一个例子:http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/

请仔细阅读上面的链接和研究模式 - 它会为你节省大量的时间和头痛。如果你理解了这种模式,请查看通用知识库他们将为您节省更多时间,并使您的代码更容易维护。

这里的关键是你有一个单独的类为数据/实体/模型和逻辑/服务/(使用数据库)的另一个类。

然后你只需要你的资料库有DbContext注入和存储库可以注射给进口商。

例如:

这是未经测试和即兴代码。我只是试图提供一个解决方案的例子。

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