ASP.NET MVC和服务层依赖注入

问题描述 投票:1回答:1

我在controllerservice中被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似乎是不好的方式......

谢谢。

.net asp.net-mvc dependency-injection unit-of-work service-layer
1个回答
5
投票

依赖注入:

首先,您必须正确掌握“依赖注入”的概念:

public TownController()
{
    _townService = new TownService(this.ModelState, null);
}

TownController没有注入任何依赖,并且你使用硬编码的_townService实现来实例化TownService

它应该看起来更像这样:

private ITownService _townService;

public TownController(ITownService townService)
{
    _townService = townService;
}

如您所见,ITownService实现正在注入控制器(使用其构造函数)。

现在,如果你注入的依赖项(ITownService)有自己的依赖项(IUnitOfWork),它并不意味着你的控制器也必须注入所有这些依赖项,因为当ITownService注入控制器时,它已经被初始化并且它的依赖关系已经被注入其中。

大多数人使用依赖注入框架来实现所有这些(以及更多),这是ASP.NET MVC的一个简单的Unity示例:

// 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>();
    }
}

这一行:

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

告诉ASP.Net MVC每当它实例化一个具有依赖性的新控制器时,它会要求UnityDependencyResolver提供实现,然后Unity将根据上面的配置执行此操作。

ModelStateDictionary:

另一个问题是您的服务层使用的是ModelStateDictionary

ModelState的概念(通常)是表示层关注的问题,用于验证和从UI(传统的HTML表单)返回/设置错误。

您应该检查并验证控制器中的模型状态,然后(通常只有在它有效时)调用服务层来执行实际操作。

此外,您必须添加对System.Web.Mvc程序集的引用,仅用于ModelState用法(不建议使用)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.