c# - 接口问题c#,以及依赖注入
问题描述
我有问题。让我们看一个例子:你得到了这个由 Employee.cs 和 Owener.cs 实现的接口:
public interface IEmployee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Location { get; set; }
}
public class Employee: IEmployee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Location { get; set; }
}
public class Owner: IEmployee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Location { get; set; }
public string Status{ get; set; } <--- //problem string
}
现在,当我们使用依赖注入并返回员工或经理的对象时,这就是我遇到问题的地方。
public class EmployeeCheck{
private IEmployee empObj;
public EmployeeCheck(IEmployee _em)
{
empObj=_em
}
public void PrintCheck()
{
string str=_em.FirstName;
string str2=(Owner)_emp.Status <--- //problem...how do I access it?? It can't be accessed cause
//IEMployee doesn't have status field!
}
所以基本上如果我使用 IEmployee 作为接口,我不能访问新的 Owner 类中的字段,如果我把它们放在接口中,那么不需要实现它的 Employee 类将被迫实现它不需要!由于 DI 注入或其他设计模式,我确实需要 IEmployee
好的,我不能使用抽象类......所以让我们讨论更多关于 IStatus 解决方案......所以你正在谈论编写这样的代码:
public interface IStatus:IEmployee
{
public string Title { get; set; }
}
公共类所有者:IEmployee,IStatus { public string FirstName { get; 放; }
public string LastName { get; set; }
public string Location { get; set; }
public string Status{ get; set; } <--- //problem string
}
但是我如何在员工检查类中工作呢?
公共类 EmployeeCheck {
private IEmployee empObj;
public EmployeeCheck(IEmployee _em, IStatus)
{
empObj=_em
}
}
解决方案
这取决于您如何使用或为什么必须使用依赖注入。我认为根据您的示例,在这些情况下使用它并不是很好,因为它给您带来了一些简单的复杂性。
如果要使用 Status 值执行操作,则可以通过生成新接口来隔离接口。像这样。
public interface IStatus { string Status { get; set; } }
然后你在 Owner 和你的构造函数 EmployeeCheck 中实现这个接口IStatus
。
但是,如果没有必要,为什么不 IEmployee 你将它作为一个抽象类来做。
public abstract class Employee
{
public string Name { get; set; }
public string LastName { get; set; }
public string Location { get; set; }
}
public class Owner : Employee
{
public string Status { get; set; }
}
public class EmployeeCheck
{
public EmployeeCheck(Employee employee)
{
var owner = employee as Owner;
var statuts= owner.Status;
}
}
推荐阅读
- hyperledger-fabric - Hyperledger Fabric 中的私有数据是否适用读写原则?
- c# - c# DataGridView 复选框不会被选中
- python - Selenium - 元组对象不可调用
- html - 如何以角度获取条形图的滚动条
- r - `dplyr::full_join()` 不适用于列表列
- excel - SoftArtisans 'Border.Part.Outline' 作为 SoftArtisans 'Border.Part.All' 工作
- flutter - 在 Flutter 的 firebase_messaging 中调试 onLaunch 回调
- c# - 如何使用“绑定密钥”,例如 AMQP.net lite 库中的主题
- javascript - 我怎样才能翻译以下 JavaScript 以便它在 PHP 中完成?
- javascript - 当项目较少时如何在数组上映射时显示不同的内容