2014-01-21 35 views
0

我试图让团结依赖注入与利用实体框架WCF服务工作,但我越来越感到困惑的使用情境和存储库的。使用依赖注入WCF服务方法和EF

我设计它的方式是拥有一些存储库类,例如UserRepository,MessageRepository,LocationRepository,每个存储库接受一个EF DbContext对象作为构造参数。这使我可以通过调用context.Save()或回滚等来控制上下文级别的工作单元来控制跨存储库的事务。

我在混乱的是,我不知道如何在依赖注入表示此。我想要两个场景

a)当WCF服务通过WCF方法实例化时,我希望它使用我创建的DbContext类并创建存储库对象,传递创建的DbContext,它将连接到实体框架数据库。

B)当WCF服务的方法是从一个单独的测试项目进行测试,我想嘲笑资源库对象返回嘲笑数据。

如果我只是使用存储库类,这将是相对简单的,因为在我可以调用Container.Resolve()的每个WCF服务方法中,然后我可以使用Unity WCF工厂来设置WCF实例的具体类型,在我的测试项目中为模拟类型手动配置Unity容器。

但是,难点在于我的存储库需要一个DbContext类作为构造函数参数传递,这个构造函数参数将在存储库的生命周期中生存,并且我还需要能够在我的服务中引用它方法,例如

public bool CreateUser(DbUser user) 
{ 
    try 
    { 
     using (var context = new MyDbContext()) 
     { 
      var repository = new UserDataRepository(context); 

      user.GenerateUserLight(); 
      user.GenerateUserProfileLight(); 

      var result = repository.InsertItem(user); 
      repository.Save(); 

      return result; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

我怎么能适应使用统一依赖注入,所以我可以嘲笑它的测试项目上面的方法?

回答

0

至于我可以看到这里的问题是,你应该你的仓库内创建背景,但事实上,你实际上是newing了在服务范围内,然后将其传递到你的仓库是一个有点代码味道。

为什么不让仓库处理DbContext?这样,您就不会将存储库首先与Entity Framework耦合。

服务只能有一个IUserRepository接口..没有具体实施的依赖关系。

private readonly IUserRepository _userRepository; 

public MyService(IUserRepository userRepository) 
{ 
    this._userRepository = userRepository; 
} 
public bool CreateUser(DbUser user) 
{ 
    try 
    { 
      user.GenerateUserLight(); 
      user.GenerateUserProfileLight(); 

      var result = this._userRepository.InsertItem(user); 
      this._userRepository.Save(); 

      return result; 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 

用户存储库将在其构造函数接受的DbContext,你需要注册与DI容器也是上下文,这样,当它注入到该服务的DI可以构造UserRepository。

public class UserRepository : IUserRepository 
{ 
    private readonly MyDbContext context; 

    public UserRepository(MyDbContext context) 
    { 
     this.context = context; 
    } 
} 

然后,您可以简单地通过构造函数将“UserRepository”注入服务。

这也使您能够创建不需要背景可言,只要为您的存储库的接口模拟类型的数据仓库。