C# WCF服务可测试性和依赖注入
我有一个WCF服务,它托管在MVC应用程序中。服务与多个存储库交互(我采用代码优先设计)来完成其工作。目前,我在每个服务方法中创建了一个所有存储库类的实例,我认为这很糟糕,而且我的服务与存储库类完全耦合。我想知道我应该如何为WCF服务实现一个好的、干净的DIC# WCF服务可测试性和依赖注入,c#,asp.net-mvc,wcf,dependency-injection,C#,Asp.net Mvc,Wcf,Dependency Injection,我有一个WCF服务,它托管在MVC应用程序中。服务与多个存储库交互(我采用代码优先设计)来完成其工作。目前,我在每个服务方法中创建了一个所有存储库类的实例,我认为这很糟糕,而且我的服务与存储库类完全耦合。我想知道我应该如何为WCF服务实现一个好的、干净的DI 提前感谢。我建议使用依赖倒置原则:让您的存储库实现一个特定的接口,然后让您的服务类接收该接口的一个(或多个)对象。不要让它直接引用混凝土类。然后,您需要在服务类上执行的所有操作就是调用接口公开的方法,以显示所需的任何/所有信息 这样做将使代
提前感谢。我建议使用依赖倒置原则:让您的存储库实现一个特定的接口,然后让您的服务类接收该接口的一个(或多个)对象。不要让它直接引用混凝土类。然后,您需要在服务类上执行的所有操作就是调用接口公开的方法,以显示所需的任何/所有信息 这样做将使代码彼此分离,因为它们都依赖于抽象,而且您仍然可以获得所请求的出色功能 您可以这样做:假设您的WCF服务类需要RepositoryA,它实现了IRepositoryA。您要做的是在其上有一个IRepositoria类型的字段(通常是
private
)。然后在服务中创建一个构造函数,该构造函数接受IRepositoryA类型的对象,然后设置传入该对象的字段变量。类似于在上找到的内容:
有关依赖项反转原则的更多信息,请阅读Bob叔叔的文章。我建议使用依赖项反转原则:让您的存储库实现一个特定的接口,然后让您的服务类接收该接口的一个(或多个)对象。不要让它直接引用混凝土类。然后,您需要在服务类上执行的所有操作就是调用接口公开的方法,以显示所需的任何/所有信息 这样做将使代码彼此分离,因为它们都依赖于抽象,而且您仍然可以获得所请求的出色功能 您可以这样做:假设您的WCF服务类需要RepositoryA,它实现了IRepositoryA。您要做的是在其上有一个IRepositoria类型的字段(通常是
private
)。然后在服务中创建一个构造函数,该构造函数接受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(....);
}
}
公共服务类:iSeries设备
{
私有只读IRepositoryFactory\u repositoryFactory;
公共服务类(IRepositoryFactory)
{
_repositoryFactory=工厂;
}
公共IList GetYourItems()
{
var repository=_repositoryFactory.GetRepositoryOne();
return repository.GetItems(..);
}
}
使用这种方法,您将只需要注册和解析您的存储库工厂,而不是所有单个存储库。这是一种混合方法,但我认为它非常干净,易于理解。当然,您不能总是在每次调用中使用工厂并解析存储库。如果您愿意,我也可以展示一个示例。您可以采取的一种方法是在您的服务类中注入一个存储库工厂,然后从工厂调用/获取存储库 存储库工厂:
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(....);
}
}
公共服务类:iSeries设备
{
私有只读IRepositoryFactory\u repositoryFactory;
公共服务类(IRepositoryFactory)
{
_repositoryFactory=工厂;
}
公共IList GetYourItems()
{
var repository=_repositoryFactory.GetRepositoryOne();
return repository.GetItems(..);
}
}
使用这种方法,您将只需要注册和解析您的存储库工厂,而不是所有单个存储库。这是一种混合方法,但我认为它非常干净,易于理解。当然,您不能总是在每次调用中使用工厂并解析存储库。如果您愿意,我也可以展示一个示例。+1谢谢您的回复,是的,我的存储库类扩展了它们自己的接口。问题是我不知道该怎么做,在哪里做你说的?+1谢谢你的回答,是的,我的存储库类扩展了它们自己的接口。问题是我不知道该怎么做,该在哪里做你说的?谢谢爸爸,我也很高兴看到你这么说。谢谢爸爸,我也很高兴看到你这么说。如果你自己还没有找到模板代码,我可以明天给你发我的,如果那时没有人的话。正如我看到你的问题,它是:“我如何使用Unity为wcf服务实现DI”@CasperLeonNielsen谢谢,任何帮助都是有用的。我明天会查看你的回复。如果你自己还没有找到模板代码,我可以明天给你发我的,如果那时没有人找到的话。正如我看到你的问题,它是:“我如何使用Unity为wcf服务实现DI”@CasperLeonNielsen谢谢,任何帮助都是有用的。我明天会查看你的答复。