c# - 在c#中使用接口(interface)实例化类

标签 c# class interface instantiation parameterized-constructor

嗨,这可能很简单,但我正在尝试使用接口(interface)来理解类实例化。下面是我的代码:

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

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

最佳答案

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

如您所见,LogServiceHelperRepository 类具有严格的依赖性,因此您是对的,这些接口(interface)不会为您购买任何东西。但是,如果它们被注入(inject):

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

你突然获得了抽象的好处。值得注意的是,单元测试可能会传入虚假存储库,并且您可以切换到 IRepository 的另一个实现,而无需更改 LogServiceHelper

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

关于c# - 在c#中使用接口(interface)实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54563166/

相关文章:

java - 这个符号在 Java 中意味着什么? (比较器<?super T> c)

java - 将 java 方法引用分配给接口(interface)

go - 如何使用接口(interface)在 Golang 中为数据库实现依赖注入(inject)

c# - 使用 C#(Windows 应用程序)创建 HTML 文档并在其中放置表格

c# - C#中字符串的内部表示

c# - 将Texture2D转换为视频

PHP fatal error : Class 'Imagick' not found - Windows 7 64bit IIS PHP 5. 2

c++ - 这个类声明是什么意思?

jquery - 使用 Jquery 修改下拉列表

c# - 打开Excel文件一直提示 "Read Only"