如何解决控制器操作的类型依赖性?

时间:2014-04-23 11:22:54

标签: c# dependency-injection inversion-of-control unity-container asp.net-mvc-5

更新

我设法创造了令人满意的东西。您可以看到代码here on PasteBin的相关部分。如果有什么我可以改进的地方请告诉我。我有一种唠叨的感觉,这不是非常有效。

澄清

虽然它似乎与d_z建议的静态依赖关系一起使用,但我希望,为了避免实例化未使用的对象,我可以使用类似的东西:

public class HomeController : Controller
{
  [Dependency]
  protected IBaseData ActionData { get; set; }

  public ActionResult Index()
  {
    return View(ActionData);
  }

  public ActionResult About()
  {
    return View(ActionData);
  }
}

IndexDataAboutData个实例中的数据实际上并不是静态的。实例属性使用数据库中的数据设置。 DbProvider被注入这些类中。

最终我想要的是最小化内存占用和数据库访问。

原始

我们说我们有以下基本控制器(带有相应的视图):

public class HomeController : Controller
{
  public ActionResult Index()
  {
    return View();
  }

  public ActionResult About()
  {
    return View();
  }
}

我们还有两个具有相同界面的类:

public class IndexData : IBaseData
{
  public string Name { get; set; }
  public string Index { get; set; }

  public IndexData()
  {
    Name = "Index";
    Index = "This is an Index instance";
  }
}

public class AboutData : IBaseData
{
  public string Name { get; set; }
  public string About { get; set; }

  public AboutData()
  {
    Name = "About";
    About = "This is an About instance";
  }
}

我希望 Unity 将其中一个类的实例(取决于执行的操作)注入相应的视图。我试图了解如何实现这一点,但我很难过。这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您要求的内容毫无意义。依赖注入是关于注入(设计时)行为(a.k.a。服务)。但是,您要尝试的是注入运行时数据。所以这不是IoC容器应该处理的任务。

接下来,视图应该完全不知道任何依赖注入。控制器应从其action方法返回视图所需的所有数据。确保您的AboutIndex操作方法返回正确的实例。

答案 1 :(得分:0)

要在Unity中为类型注册多个映射,您必须创建名为的注册,如下所示:

myContainer.RegisterType<IBaseData, IndexData>("Index");
myContainer.RegisterType<IBaseData, AboutData>("About");

因此,在您的操作中,您可以相应地解析实例:

指数:

IBaseData data = myContainer.Resolve<IBaseData>("Index");

关于:

IBaseData data = myContainer.Resolve<IBaseData>("About");

或者对于静态依赖项,它的工作原理如下:

[Dependency("Index")]
IBaseData data { get; set; }

查看herehere了解详情