实例化类在C#中的接口

问题描述 投票:2回答:2

嗨,这可能是微不足道的,但我想了解使用接口的类的实例化。所以,下面是我的代码:

public interface IRepository
{
    string GetMemberDisplayName();
}

public class Repository : IRepository
{
    private readonly Manager _manager;

    public Repository() {}

    public Repository(string connectionName)
    {
        _manager = new Manager(connectionName);
    }

    public string GetMemberDisplayName(string ID)
    {
        return "FooFoo";
    }
}

现在,在使用存储库类功能的另一个类,如下所示已经实例吧:

public class LogServiceHelper
{
    readonly IRepository _alrAttendance;
    readonly IRepository _alrUsers;

    public LogServiceHelper()
    {
        _alrAttendance = new Repository("value1");
        _alrUsers = new Repository("value2");
    }

    public string GetMemberName(string empId)
    {
        return _alrUsers.GetMemberDisplayName(empId);
    }
}

我的问题是,如果这是实例与参数构造函数的类正确的方式。如果是,那么第二个问题是为什么我们需要的接口在这种情况下。我们可以直接实例化类,而无需创建界面?

c# class interface instantiation parameterized-constructor
2个回答
2
投票

是的,就是如何调用参数的构造函数,但没有,这不是你应该做的事情。

当你拥有了它,LogServiceHelperRepository类硬依赖,所以你是正确的,接口不买任何东西。但是,如果他们被注射了:

public LogServiceHelper(IRepository attendanceRepo, IRepository userRepo)
{
    _alrAttendance = attendanceRepo;
    _alrUsers = userRepo;
}

你突然获得抽象的好处。值得注意的是,一个单元测试可以传递假信息库,并且您可以切换到IRepository的另一种实现,而不改变LogServiceHelper

接下来的问题是那么“谁创造了Repository具体类?”。对于这一点,我是指你的各种DI / IoC容器在那里,如Autofac,团结,NInject的。


0
投票

我们可以直接实例化类,而无需创建界面?

这的确是真实的,它可能没有任何问题的工作。但是,我们要来的关键问题:

  • 是我的代码可测试的,我怎么会检验这一段代码?
  • 我可以很容易改变的行为,而改变LogServiceHelper

如果不依靠抽象,回答上述问题是不幸的是,没有。幸运的是,有一个名为SOLID的东西和d代表Dependency Injection Principle

public LogServiceHelper(IRepository alrAttendance, IRepository alrUsers)
{
    _alrAttendance = alrAttendance;
    _alrUsers = alrUsers;
}

所以,用这个简单的变化,你做的模量的解耦一下子你是依靠它获得了许多好处,设计抽象的。

© www.soinside.com 2019 - 2024. All rights reserved.