我正在尝试获得使用实体框架的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"注入服务。
这也将使您能够创建根本不需要上下文的模拟存储库类型,只需为您的存储库创建界面。