我有一个托管在MVC Application内的WCF 服务。服务与多个存储库(我的代码优先设计)交互以完成其工作。目前我在每个 Service 方法中创建所有 Repository 类的实例,我认为这很糟糕,我的 Service 完全耦合到 Repository 类。我想知道我应该如何为 WCF 服务实现一个漂亮而干净的 DI。
提前致谢。
我有一个托管在MVC Application内的WCF 服务。服务与多个存储库(我的代码优先设计)交互以完成其工作。目前我在每个 Service 方法中创建所有 Repository 类的实例,我认为这很糟糕,我的 Service 完全耦合到 Repository 类。我想知道我应该如何为 WCF 服务实现一个漂亮而干净的 DI。
提前致谢。
我建议使用依赖倒置原则:让你的存储库实现一个特定的接口,然后让你的服务类接受该接口(或多个接口)的一个(或多个对象)。不要让它直接引用具体类。然后,您需要在服务类上做的所有事情就是调用接口公开的方法来显示您想要的任何/所有信息。
这样做将使代码彼此分离,因为它们都依赖于抽象,并且您仍然可以获得您所请求的精彩功能。
以下是您可以执行的操作: 假设您的 WCF 服务类需要 RepositoryA,它实现了 IRepositoryA。您要做的是在其上有一个private
IRepositoryA 类型的字段(通常是 )。然后在服务中创建一个构造函数,该构造函数接受 IRepositoryA 类型的对象,然后使用传入的对象设置字段变量。类似于在此站点上找到的内容:
有关依赖倒置原则的更多信息,请阅读 Bob 大叔所说的。
您可以采取的一种方法是在您的服务类中注入一个存储库工厂,然后从工厂调用/获取您的存储库。
仓库工厂:
public interface IRepositoryFactory
{
IRepositoryOne GetRepositoryOne();
IRepositoryTwo GetRepositoryTwo();
}
public class RepositoryFactory: IRepositoryFactory
{
public DataAccess.RepositoryInterfaces.IRepositoryOne GetRepositoryOne()
{
return new RepositoryOne();
}
public DataAccess.RepositoryInterfaces.IRepositoryTwo GetRepositoryTwo()
{
return new RepositoryTwo();
}
}
服务等级:
public ServiceClass: IService
{
private readonly IRepositoryFactory _repositoryFactory;
public ServiceClass(IRepositoryFactory factory)
{
_repositoryFactory = factory;
}
public IList<YourItems> GetYourItems()
{
var repository = _repositoryFactory.GetRepositoryOne();
return repository.GetItems(....);
}
}
使用这种方法,您只需要注册和解析您的存储库工厂,而不是所有单独的存储库。这是一种混合方法,但我认为它非常干净且易于理解。当然,您总是不能在每次调用中都使用工厂并解析您的存储库。如果你愿意,我也可以展示一个样本。