首页 > 解决方案 > 接口问题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
  }

}

标签: c#interfacedependenciesinversion-of-control

解决方案


这取决于您如何使用或为什么必须使用依赖注入。我认为根据您的示例,在这些情况下使用它并不是很好,因为它给您带来了一些简单的复杂性。

如果要使用 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;
  }
}

推荐阅读