使用WCF服务方法和EF使用依赖注入



我正在尝试获得使用实体框架的WCF服务的Unity依赖注入,但是我对上下文和存储库的使用感到困惑。

我设计的方式是将许多存储库类,例如用户介绍,MessagerePository,LocationRepository,每种都接受EF DBContext对象作为构造函数参数。这使我可以通过调用Context.Save()或回滚等来控制上下文级别的工作单位,以控制跨存储库的交易。

我所遇到的困惑是我不确定如何表示依赖注入。我想有两个方案

a)当WCF服务通过WCF方法实例化时,我希望它使用我创建的dbContext类并创建存储库对象,并传递在创建的DBContext中,该对象将连接到Entity Framework数据库。

b)从单独的测试项目测试WCF服务方法时,我想模拟存储库对象以返回模拟的数据。

如果我只是在使用存储库类,这将相对简单,因为在每个WCF服务方法中,我可以调用container.resolve(),然后我可以使用Unity WCF Factory设置混凝土类型以进行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;
    }
}

如何适应上述方法以使用Unity依赖注入以便我可以为测试项目嘲笑它?

据我所知,这里的问题是,您应该在存储库中创建上下文您的存储库有点像代码。

为什么没有存储库处理dbcontext?这样,您就不会首先将存储库与实体框架耦合。

该服务只能对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"注入服务。

这也将使您能够创建根本不需要上下文的模拟存储库类型,只需为您的存储库创建界面。

最新更新