嗨,这可能是微不足道的,但我想了解使用接口的类的实例化。所以,下面是我的代码:
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);
}
}
我的问题是,如果这是实例与参数构造函数的类正确的方式。如果是,那么第二个问题是为什么我们需要的接口在这种情况下。我们可以直接实例化类,而无需创建界面?
是的,就是如何调用参数的构造函数,但没有,这不是你应该做的事情。
当你拥有了它,LogServiceHelper
对Repository
类硬依赖,所以你是正确的,接口不买任何东西。但是,如果他们被注射了:
public LogServiceHelper(IRepository attendanceRepo, IRepository userRepo)
{
_alrAttendance = attendanceRepo;
_alrUsers = userRepo;
}
你突然获得抽象的好处。值得注意的是,一个单元测试可以传递假信息库,并且您可以切换到IRepository
的另一种实现,而不改变LogServiceHelper
。
接下来的问题是那么“谁创造了Repository
具体类?”。对于这一点,我是指你的各种DI / IoC容器在那里,如Autofac,团结,NInject的。
我们可以直接实例化类,而无需创建界面?
这的确是真实的,它可能没有任何问题的工作。但是,我们要来的关键问题:
如果不依靠抽象,回答上述问题是不幸的是,没有。幸运的是,有一个名为SOLID的东西和d代表Dependency Injection Principle。
public LogServiceHelper(IRepository alrAttendance, IRepository alrUsers)
{
_alrAttendance = alrAttendance;
_alrUsers = alrUsers;
}
所以,用这个简单的变化,你做的模量的解耦一下子你是依靠它获得了许多好处,设计抽象的。