C # Как использовать интерфейсы - PullRequest
14 голосов
/ 14 октября 2011

Это относительно прямой вопрос. Но мне было интересно, что правильно использовать для доступа к методу внутри отдельного проекта через интерфейс.

Проект : 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?

Ответы [ 3 ]

20 голосов
/ 14 октября 2011
  • Вы никогда не создаете экземпляр ITest test, вы только объявляете это.
  • Ваш класс Test не наследуется от интерфейса.

Вам необходимо обновить объявление класса

public class Test : ITest // interface inheritance 
{

И в вашем контроллере создайте экземпляр test.

ITest test = new Test();

По мере продвижения вперед вы захотите изучить методы внедрения экземпляра Test в контроллер, чтобы у вас не было жесткой зависимости от него, а только от интерфейса ITest. В комментарии упоминается IoC или Inversion of Control, но вы должны рассмотреть различные методы Inpension Inversion (одним из них является IoC, внедрение зависимостей и т. Д.).

5 голосов
/ 14 октября 2011

Класс должен читать:

public class Test : ITest

в своем объявлении.

4 голосов
/ 14 октября 2011

Прежде всего, вам нужно, чтобы ваш 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 вне конструктора и передать его или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...