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);
    }
}

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

4

2 回答 2

2

是的,这就是调用参数化构造函数的方法,但是不,这不是你应该做的。

正如你所拥有的,它对类LogServiceHelper有很强的依赖关系Repository,所以你是对的,接口不会给你带来任何东西。但是,如果它们被注入

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

你突然获得了抽象的好处。值得注意的是,单元测试可以通过假存储库,并且您可以切换到另一个实现IRepository而不更改LogServiceHelper.

下一个问题是“谁创建了Repository具体类?”。为此,我建议您参考各种 DI/IoC 容器,例如 Autofac、Unity 和 NInject。

于 2019-02-06T22:06:30.830 回答
0

我们可以直接实例化类而不创建接口吗?

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

  • 我的代码是否可测试,我将如何测试这段代码?
  • 我可以在不更改 LogServiceHelper 的情况下轻松更改行为吗

如果您不依赖抽象,那么不幸的是,上述问题的答案是,。幸运的是,有一种叫做 SOLID 的东西,而 D 代表Dependency Injection Principle

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

所以,通过这个简单的改变,你解耦了模块,突然之间你依赖于抽象,这为设计带来了很多好处。

于 2019-02-06T22:10:25.177 回答