controller
和service
中由controller
调用的构造函数存在一些问题。
这是我的服务:
// model state dictionary for validation
private ModelStateDictionary _modelState;
// initialize UnitOfWork
private IUnitOfWork _unitOfWork;
public TownService(ModelStateDictionary modelState, IUnitOfWork unitOfWork)
{
_modelState = modelState;
_unitOfWork = unitOfWork;
}
现在在我的控制器中我想创建新服务,传递控制器this.ModelState
但不想在控制器中添加UnitOfWork
。
这样的事情:
private ITownService _townService;
public TownController()
{
_townService = new TownService(this.ModelState, null);
}
以便考虑UnitOfWork
的所有事情都在服务范围内完成。控制器只传递自己的modelState
,服务是创建新UnitOfWork
的服务。
这可能也是好方法吗?我怎样才能做到这一点?或者我应该在控制器中添加new UnitOfWork
而不是null参数?
因为我想尽可能地将Core,DAL,Web分开,以便一切都发挥作用,并且在控制器和服务中添加UnitOfWork似乎不是很好的方式......
感谢。
答案 0 :(得分:5)
依赖注入:
首先,您必须正确掌握'依赖注入'的概念:
public TownController()
{
_townService = new TownService(this.ModelState, null);
}
TownController
未向其注入任何依赖项,并且您使用硬编码_townService
实现来实例化TownService
。
看起来应该更像这样:
private ITownService _townService;
public TownController(ITownService townService)
{
_townService = townService;
}
如您所见,ITownService
实现正在注入控制器(使用其构造函数)。
现在,如果您注入的依赖项(ITownService
)有自己的依赖项(IUnitOfWork
),那么这并不意味着您的控制器也必须注入所有这些依赖项,因为当{{ 1}}被注入控制器,它已经被初始化并且它的依赖关系已被注入它。
大多数人使用依赖注入框架来实现所有这些(以及更多),这是ASP.NET MVC的简单Unity示例:
ITownService
这一行:
// some code omitted for brevity
internal static class DependencyResolvingConfig
{
internal static IUnityContainer Configure()
{
var container = new UnityContainer();
RegisterTypes(container);
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
internal static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IUnitOfWork, UnitOfWork>();
container.RegisterType<ITownService, TownService>();
}
}
告诉ASP.Net MVC,每当它实例化一个具有依赖关系的新控制器时,它会要求DependencyResolver.SetResolver(new UnityDependencyResolver(container));
提供实现,然后Unity将根据上面的配置执行此操作。
<强> ModelStateDictionary:强>
另一个问题是您的服务层正在使用UnityDependencyResolver
:
ModelStateDictionary
的概念(通常)是表示层关注的问题,用于验证和从UI(传统的HTML表单)返回/设置错误。
您应该检查并验证控制器中的模型状态,然后(通常只有在它有效的情况下)才调用服务层来执行实际操作。
此外,您必须添加对ModelState
程序集的引用,仅用于System.Web.Mvc
用法(不推荐)。