我正在使用asp.net MVC 2来开发一个网站。 IUser曾经是模型和视图之间的接口,可以更好地分离关注点。但是,这里的事情变得有些混乱。在处理用户登录的控制器中:我有以下内容:
IUserBll userBll = new UserBll();
IUser newUser = new User();
newUser.Username = answers[0].ToString();
newUser.Email = answers[1].ToString();
userBll.AddUser(newUser);
User类在Web项目中定义为实现IUser的具体类。 DAL中有一个类似的类实现相同的接口并用于保存数据。但是,当调用userBll.AddUser时,即使两个Users类都实现了接口(InvalidCastException),也无法将User类型的newUser转换为DAL User类。
使用转换运算符可能是一个选项,但它会使DAL和Web之间的依赖性与使用接口的初始目标相悖。
有什么建议吗?
答案 0 :(得分:0)
你应该有一个处理依赖注入的项目。 此项目引用您的Domain项目(其中定义了IUserBll),以及具有DLL实现的项目。所以你的MVC项目将引用依赖注入项目并给出一个特定的接口,请求DI实现它。
查看StructureMap或Castle Windsor。
//Global.asax
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
//Dependency Injection Project:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType != null)
{
return (IController)ObjectFactory.GetInstance(controllerType);
}
return null;
}
}
这样你的控制器看起来更像是:
public class SomeController
{
private IUserBll _repository;
public SomeController(IUserBll repository)
{
_repository = repository;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Someform f)
{
...
_repository.AddUser(...);
}
}
例如,当您使用StructureMap控制器工厂时,MVC将在后台将依赖项添加到您的控制器中。