这是一个相对直截了当的问题。但我想知道通过使用接口访问单独项目中的方法的正确用法是什么。
项目: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
来解决这个问题吗?
答案 0 :(得分:20)
ITest test
,只能声明它。Test
类不会从界面继承。您需要更新您的班级声明
public class Test : ITest // interface inheritance
{
在您的控制器中,实例化test
。
ITest test = new Test();
随着您的进一步发展,您将需要探索将Test
实例注入控制器的技术,以便您不必依赖它,而只是在接口ITest
上。评论提及IoC或控制反转,但您应该研究各种依赖性反转技术技术(IoC是其中之一,依赖注入等)。
答案 1 :(得分:5)
课程需要阅读:
public class Test : ITest
在其声明中。
答案 2 :(得分:4)
首先,您需要让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
并将其传递给某个东西。
答案 3 :(得分:1)
接口基本上是所有接口实施类都应遵循的契约。它们看起来像一个类,但是没有实现。
在C#
中,按惯例,接口名称是通过在前缀I之前定义的,因此,如果要使用一个名为shapes的接口,则可以将其声明为IShapes
Improves code re-usability
假设您要绘制Circle
,Triangle.
您可以将它们组合在一起并命名为Shapes
,并具有绘制Circle
和Triangle
的方法
但是具体实施将不是一个好主意,因为明天您可能会决定再拥有2个Shapes
Rectangle
和Square
。现在,当您添加它们时,很有可能会破坏代码的其他部分。
使用接口,您可以将不同的实现与合同隔离
使用场景第1天
系统要求您创建一个用于绘制圆和三角形的应用程序
interface IShapes
{
void DrawShape();
}
class Circle : IShapes
{
public void DrawShape()
{
Console.WriteLine("Implementation to Draw a Circle");
}
}
class Triangle : IShapes
{
public void DrawShape()
{
Console.WriteLine("Implementation to draw a Triangle");
}
}
static void Main()
{
List <IShapes> shapes = new List<IShapes>();
shapes.Add(new Circle());
shapes.Add(new Triangle());
foreach(var shape in shapes)
{
shape.DrawShape();
}
}
使用场景第2天
如果要求您在其中添加Square
和Rectangle
,您要做的就是在class Square: IShapes
中为其创建一个标准,并在Main
中添加到列表{ {1}}