С# Как использовать интерфейсы
Это относительно прямой вопрос. Но мне было интересно, как правильно использовать доступ к методу внутри отдельного проекта с помощью интерфейса.
Проект: Test.ClassLibrary
Интерфейс
public interface ITest
{
string TestMethod();
}
Класс:
public class Test : ITest
{
public string TestMethod()
{
return "Test";
}
}
Проект: Test.Web
контроллер
public class HomeController : Controller
{
private ITest test;
public ActionResult Index()
{
return Content(test.TestMethod());
}
}
Приведенное выше возвращает NullReferenceException
. Я предполагаю это, потому что контроллер добирается до интерфейса и не знает, куда идти дальше.
Какой лучший способ исправить это? Должен ли я ссылаться на класс Test
в контроллере или могу ли я каким-то образом уйти, имея только ссылку на ITest
?
Ответы
Ответ 1
- Вы никогда не создаете экземпляр
ITest test
, вы только объявляете его.
- Ваш класс
Test
не наследуется от интерфейса.
Вам нужно обновить объявление класса
public class Test : ITest // interface inheritance
{
И в вашем контроллере создайте экземпляр Test
.
ITest test = new Test();
По мере того, как вы продвигаетесь дальше, вам нужно изучить методы ввода экземпляра Test
в контроллер, чтобы у вас не было жесткой зависимости от него, а просто на интерфейсе ITest
. В комментарии упоминается IoC или Inversion of Control, но вы должны изучить различные методы техники инверсии зависимостей (IoC является одним из них, инъекцией зависимостей и т.д.).
Ответ 2
Класс должен читать:
public class Test : ITest
в объявлении.
Ответ 3
Во-первых, вам нужно, чтобы ваш класс Test
наследовал/реализовал ITest
.
class Test : ITest
{
public string TestMethod() { return "test"; }
}
Затем в классе контроллера вам нужно инициализировать Test
- напрямую или в конструкторе.
public class HomeController : Controller
{
public ITest test = new Test();
public ActionResult Index()
{
return Content(test.TestMethod());
}
}
Хотя во многих случаях вам нужно создать ITest
вне конструктора и передать его или что-то еще.
Ответ 4
Интерфейсы используются для принудительной реализации свойств и методов в классе. Вы никогда не сможете создать экземпляр, потому что они исключит вам исключения.
Вы можете использовать этот код
public interface ITest
{
string TestMethod();
}
public class Test :ITest
{
public Test()
{
//do something here
}
public string TestMethod()
{
return "Test";
}
}
public class HomeController : Controller
{
private Test test = new Test();
public ActionResult Index()
{
return Content(test.TestMethod());
}
}