使用Unity根据请求动态注入类

时间:2014-02-06 00:35:56

标签: c# asp.net-mvc dependency-injection unity-container

我正在使用Unity开发MVC4应用程序。我的架构是这样的。

public interface IRepositoy<T>
{
}

public class DataRepository<T>:IRepository
{
}

基本上这里T是模型。

然后再次

 public interface IModel
 {
 //Property and methods
 }

public class Mobile: IModel

所有模型类都继承自此接口。

现在统一我使用以下语法

RegisterType<IRepository<Mobile>, DataRepository<Mobile>>(); 

这就是问题所在。

我希望这个“Mobile”类依赖于请求URL。说移动页面是请求“移动”类将被注入,如果“相机”页面被请求将注入相机对象。

我可以使用if-else来做到这一点。但我正在寻找更复杂的方法,使代码更易于维护和健壮。我是Unity和DI的新手,所以不知道最好的方法。

你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

通过IoC了解依赖注入。基本上,你可以说我希望将一个类型为Mobile的IRepository注入我的MobileController:

public MobileController(IRepository<Mobile> repo) {}

但是,当我使用PersonController时,我想要一个IRepository或者输入Person:

public PersonController(IRepository<Person> repo) {}

然后使用IoC,您可以注册所有依赖项。所以你可以说,如果一个控制器要求一个类型为Mobile的IRepository,给它们一个类型为Mobile的DataRepository,但是如果一个控制器要求一个Person类型的IRepository,给它们一个Person类型的DataRepository。 Ninject和AutoFac是两种流行的选择。设置Ninject看起来像:

Bind<IRepository<Mobile>>().To<DataRepository<Mobile>>();
Bind<IRepository<Person>>().To<DataRepository<Person>>();

在AppStart中注册Ninject,你很高兴。

答案 1 :(得分:0)

我认为你正在以错误的方式看待它。

在这种情况下,您只需要一个产品控制器。您的基类实体将是Product,然后您将从模型中继承该类,例如Mobile,Desktop或其他类似的东西。检查EF继承:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application