2011-10-14 18 views
12

Esta es una pregunta relativamente simple. Pero me preguntaba cuál es el uso correcto para acceder a un método dentro de un proyecto separado mediante el uso de una interfaz.C# Cómo usar las interfaces

Proyecto: Test.ClassLibrary

interfaz:

public interface ITest 
{ 
    string TestMethod(); 
} 

Clase:

public class Test : ITest 
{ 
    public string TestMethod() 
    { 
     return "Test"; 
    } 
} 

Proyecto:Test.Web

Controller:

public class HomeController : Controller 
{ 
    private ITest test; 
    public ActionResult Index() 
    { 
     return Content(test.TestMethod()); 
    } 

} 

Los rendimientos por encima de un NullReferenceException. Supongo que es porque el controlador llega a la interfaz y no sabe a dónde ir.

¿Cuál es la mejor manera de arreglar esto? ¿Tengo que hacer referencia a la clase Test en el controlador o puedo de alguna manera salir con la única referencia a ITest?

+0

¿Usted realmente tiene una _instance_ de '' ITest' en su test' variable? Si 'test == null', obtendrás ese error, y no tiene nada relacionado con tu interfaz' ITest' –

+0

Editado la pregunta: Olvidé escribir: ITest con la declaración de clase de prueba – jzm

+0

posible duplicado de [ ¿Qué es una NullReferenceException en .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

Respuesta

18
  • Nunca instancia ITest test, solo lo declara.
  • Su clase Test no hereda de la interfaz.

necesita actualizar su declaración de la clase

public class Test : ITest // interface inheritance 
{ 

Y en su controlador, una instancia test.

ITest test = new Test(); 

medida que vaya más adelante, usted querrá explorar técnicas para la inyección de la instancia Test en el controlador de modo que usted no tiene una dependencia con fuerza sobre ella, pero sólo en la interfaz ITest. Un comentario menciona IoC, o Inversion of Control, pero debe examinar varias técnicas de técnicas Dependency Inversion (IoC es una de ellas, , inyección de dependencia, etc.).

+2

O, en lugar de crear una instancia de Prueba, podría usar un Contenedor de IoC para resolver la clase concreta de ITest. –

+0

Esto funciona, pero aún depende de la clase de prueba. ¿Puedes elaborar sobre las otras técnicas si evitan esto? – jzm

+0

@rudeovskizebear, voy a ser honesto y decir que el modelo ASP.NET MVC no es algo que utilizo, pero buscar en Google MVC + Dependency Injection devuelve una gran cantidad de resultados, y aparentemente lo hicieron más fácil en ASP.NET MVC 3. Tal vez un buen lugar para comenzar es [esta serie de blogs] (http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html). –

4

La clase tiene que leer:

public class Test : ITest 

en su declaración.

+0

Los métodos de interfaz no necesitan ser declarados abstractos. De hecho, no pueden tener * ningún * modificadores. –

+3

Sí, tienes razón. Yo fallo. –

+0

Al código le falta algún tipo de creación de objeto (nuevo, contenedor IoC, fábrica, etc.) para Test() –

3

En primer lugar, necesita que su clase Test herede/implemente ITest.

class Test : ITest 
{ 
    public string TestMethod() { return "test"; } 
} 

Luego, en su clase del controlador, es necesario inicializar test - ya sea directamente, o en el constructor.

public class HomeController : Controller 
{ 
    public ITest test = new Test(); 
    public ActionResult Index() 
    { 
     return Content(test.TestMethod()); 
    } 
} 

Aunque en muchos casos, se debe preferir para crear el ITest fuera del constructor y pasarlo en o algo.

0

Las interfaces se usan para forzar implementaciones de propiedades y métodos en una clase. Nunca podrías instanciarlos porque te arrojarán excepciones.

Usted puede utilizar este código

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()); 
    } 

} 
+1

Allan, this no resuelve su problema 1) Tampoco puedes instanciar 'test', por lo que la excepción de referencia nula que está recibiendo continuará. 2) Él * quiere * depender de 'ITest' en su controlador, ya que la implementación de 'Prueba' podría ser reemplazada por otra cosa. –

+0

Gracias por el recordatorio amigo :) –

Cuestiones relacionadas