如何调用在接口的具体类中实现的新方法 我正在使用结构图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);
}
答案 0 :(得分:1)
在接口上,您只能调用接口中定义的内容 - 它是&#34;公共基础的定义&#34;所有实现它的类。问问自己:如果你得到的ICompanyRepository
类型没有实现DisplayLog
会怎么样?
这意味着:不可能立即调用除接口方法之外的任何东西。
要在DisplayLog
上致电customerRepository
,有三种方式:
DisplayLog()
添加到界面毕竟,我不太确定你所做的是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)
这里要提出几个问题:
DisplayLog()
在CustomerRepository的上下文中意味着什么?从根本上说,您的存储库的行为应该是您的控制器所不知道的,这是控制反转原理的本质。它所关心的是,给定存储库接口提供的显式契约,方法调用将返回客户。记录是存储库的一个问题。
一个相当传统的设置,从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()
并返回结果。通常会涉及更多,但这是返回数据的控制器工作流程的基本要点。