Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务可测试性和依赖注入_C#_Asp.net Mvc_Wcf_Dependency Injection - Fatal编程技术网

C# WCF服务可测试性和依赖注入

C# WCF服务可测试性和依赖注入,c#,asp.net-mvc,wcf,dependency-injection,C#,Asp.net Mvc,Wcf,Dependency Injection,我有一个WCF服务,它托管在MVC应用程序中。服务与多个存储库交互(我采用代码优先设计)来完成其工作。目前,我在每个服务方法中创建了一个所有存储库类的实例,我认为这很糟糕,而且我的服务与存储库类完全耦合。我想知道我应该如何为WCF服务实现一个好的、干净的DI 提前感谢。我建议使用依赖倒置原则:让您的存储库实现一个特定的接口,然后让您的服务类接收该接口的一个(或多个)对象。不要让它直接引用混凝土类。然后,您需要在服务类上执行的所有操作就是调用接口公开的方法,以显示所需的任何/所有信息 这样做将使代

我有一个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谢谢,任何帮助都是有用的。我明天会查看你的答复。