更新
我设法创造了令人满意的东西。您可以看到代码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);
}
}
IndexData
和AboutData
个实例中的数据实际上并不是静态的。实例属性使用数据库中的数据设置。 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 将其中一个类的实例(取决于执行的操作)注入相应的视图。我试图了解如何实现这一点,但我很难过。这甚至可能吗?
答案 0 :(得分:1)
您要求的内容毫无意义。依赖注入是关于注入(设计时)行为(a.k.a。服务)。但是,您要尝试的是注入运行时数据。所以这不是IoC容器应该处理的任务。
接下来,视图应该完全不知道任何依赖注入。控制器应从其action方法返回视图所需的所有数据。确保您的About
和Index
操作方法返回正确的实例。
答案 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; }