如何从实现接口的类调用新方法

时间:2018-03-08 11:13:47

标签: c# dependency-injection

如何调用在接口的具体类中实现的新方法 我正在使用结构图IOC容器。

public interface ICompanyRepository
{
    IEnumerable<Company> GetAll();
    Company Get(int id);
    Company Add(Company item);
    bool Update(Company item);
    bool Delete(int id);
}

public class CompanyRepository: ICompanyRepository
{
   // Provide implementation for all interface  methods

//Class CompanyRepository will also have the new method called DisplayLog
    public void DisplayLog()
    {
        //To do
    }
}

我正在尝试使用Customer控制器类中的结构映射来实现DI 我怎么能告诉我需要调用公式2的方法?

_.Scan(x =>
     {
        x.TheCallingAssembly();

        x.AddAllTypesOf<ICompanyRepository>();

        // or

    });

我的代码:

private readonly ICustomerRepository customerRepository;

public CustomerController(ICustomerRepository CustomerRepository)
{
    customerRepository = CustomerRepository;
}

// GET: Customer  
public ActionResult Index()
{
    var customers = customerRepository.DisplayLog()
   //Here i need to call CompanyRepository class methods DisplayLog()  how can i call it here ?

   // method DisplayLog() is not be shown here 
    return View(customers);
}

2 个答案:

答案 0 :(得分:1)

在接口上,您只能调用接口中定义的内容 - 它是&#34;公共基础的定义&#34;所有实现它的类。问问自己:如果你得到的ICompanyRepository类型没有实现DisplayLog会怎么样?

这意味着:不可能立即调用除接口方法之外的任何东西。

要在DisplayLog上致电customerRepository,有三种方式:

  • DisplayLog()添加到界面
  • 将customerRepository转换为CompanyRepository。但如果customerRepository属于CompanyRepository
  • 以外的任何其他类型,则会导致异常
  • 使用第二个界面

毕竟,我不太确定你所做的是DI。在我对DI的理解中,它应该是这样的:

public ActionResult Index(ILogDisplay display)
{
    var customers = display.DisplayLog(customerRepository);
    return View(customers);
}

ILogDisplay是一个新的接口,用于注入单独的类

public interface ILogDisplay 
{
    public YourResultType DisplayLog(ICustomerRepository);
}

在这个例子中,你实际上在你的类中注入了一个依赖项(ILogDisplay的实现)。

答案 1 :(得分:1)

这里要提出几个问题:

  1. 为什么存储库知道如何显示日志?
  2. DisplayLog()在CustomerRepository的上下文中意味着什么?
  3. 为什么控制器甚至要关心存储库的日志记录?
  4. 为什么DisplayLog在其返回类型明显无效的情况下分配一个名为customers的变量?
  5. 从根本上说,您的存储库的行为应该是您的控制器所不知道的,这是控制反转原理的本质。它所关心的是,给定存储库接口提供的显式契约,方法调用将返回客户。记录是存储库的一个问题。

    一个相当传统的设置,从DI的角度来看我们如下:

    <强> ICompanyRepository:

    public interface ICompanyRepository() {
        IEnumerable<Company> GetAll();
        Company Get(int id);
        Company Add(Company item);
        bool Update(Company item);
        bool Delete(int id);
    }
    

    <强> CustomerRepository:

    public class CompanyRepository: ICompanyRepository
    {
        private readonly ILogger logger;
    
        public CompanyRepository(ILogger logger) {
            this.logger = logger;
        }
        // Provide implementation for all interface  methods
    
        public Company Get(int id) {
    
            var customers = this.randomCustomerSource.Get(id);
            this.logger.Info("Whatever you want to log here");
            return customers;
        }
    }
    

    <强> CustomerController:

    public class CustomerController {
        private readonly ICustomerRepository customerRepository;
    
        public CustomerController(ICustomerRepository CustomerRepository)
        {
            customerRepository = CustomerRepository;
        }
        // GET: Customers
        public ActionResult Index()
        {
            var customers = customerRepository.GetAll()
    
    
            return View(customers);
        }
    }
    

    因此,存储库请求Ilogger,控制器请求ICompanyRepository,然后只调用GetAll()并返回结果。通常会涉及更多,但这是返回数据的控制器工作流程的基本要点。