gpt4 book ai didi

c# - 最佳实践 : StructureMap and ASP. NET MVC 2 - 抽象基 Controller 中的 Setter 注入(inject)/构造注入(inject)

转载 作者:行者123 更新时间:2023-11-30 22:43:43 25 4
gpt4 key购买 nike

public abstract class ConventionController : Controller
{
public const int PageSize = 5;

public IMappingService MappingService { get; set;}
}

如何设置StructureMap获取IMappingService实例?

编辑:

Joshua Flanagan 的帮助下,我现在有了以下代码:

雇员 Controller

public class EmployeeController : ConventionController
{
private readonly ITeamEmployeeRepository _teamEmployeeRepository;

public EmployeeController(ITeamEmployeeRepository teamEmployeeRepository)
{
_teamEmployeeRepository = teamEmployeeRepository;
}

public ActionResult Index(int page = 1)
{
// The IMappingService dependency is hidden in the AutoMappedHybridView method that is a part of the ConventionController, easy use in the controller
return AutoMappedHybridView<TeamEmployee, TeamEmployeeForm>(_teamEmployeeRepository.GetPagedEmployees(page, PageSize));

// With constructor injection I had to write this ...
// return new HybridViewResult<TSourceElement, TDestinationElement>(_mappingService, _teamEmployeeRepository.GetPagedEmployees(page, PageSize));
}
}

session Controller

public abstract class ConventionController : Controller
{
public const int PageSize = 5;

// This property is inject via StructureMap
public IMappingService MappingService { get; private set; }

public HybridViewResult<TSourceElement, TDestinationElement> AutoMappedHybridView<TSourceElement,TDestinationElement>(PagedList<TSourceElement> pagedList, string viewNameForAjaxRequest)
{
return new HybridViewResult<TSourceElement, TDestinationElement>(MappingService, pagedList, viewNameForAjaxRequest);
}

public HybridViewResult<TSourceElement, TDestinationElement> AutoMappedHybridView<TSourceElement,TDestinationElement>(PagedList<TSourceElement> pagedList)
{
return new HybridViewResult<TSourceElement, TDestinationElement>(MappingService, pagedList);
}

public HybridViewResult<TSourceElement, TDestinationElement> AutoMappedHybridView<TSourceElement, TDestinationElement>(TSourceElement sourceElement)
{
return new HybridViewResult<TSourceElement, TDestinationElement>(MappingService, sourceElement);
}

public HybridViewResult<TSourceElement, TDestinationElement> AutoMappedHybridView<TSourceElement, TDestinationElement>(TSourceElement sourceElement, string viewNameForAjaxRequest)
{
return new HybridViewResult<TSourceElement, TDestinationElement>(MappingService, sourceElement, viewNameForAjaxRequest);
}
}

混合 View 结果

public class HybridViewResult<TSourceElement, TDestinationElement> : BaseHybridViewResult
{
public HybridViewResult(IMappingService mappingService, PagedList<TSourceElement> pagedList)
{
ViewModel = mappingService.MapToViewModelPagedList<TSourceElement, TDestinationElement>(pagedList);
}

public HybridViewResult(IMappingService mappingService, PagedList<TSourceElement> pagedList, string viewNameForAjaxRequest)
{
ViewNameForAjaxRequest = viewNameForAjaxRequest;
ViewModel = mappingService.MapToViewModelPagedList<TSourceElement, TDestinationElement>(pagedList);
}

public HybridViewResult(IMappingService mappingService, TSourceElement model)
{
ViewModel = mappingService.Map<TSourceElement, TDestinationElement>(model);
}

public HybridViewResult(IMappingService mappingService, TSourceElement model, string viewNameForAjaxRequest)
{
ViewNameForAjaxRequest = viewNameForAjaxRequest;
ViewModel = mappingService.Map<TSourceElement, TDestinationElement>(model);
}
}

如您所见,HybridViewResult 需要 IMappingService 依赖项。

如果我在 ConventionController 中使用构造函数,我会“污染”我的 EmployeeController(恕我直言)。

如果 EmployeeController 直接需要 IMapping 依赖项,我会使用构造函数进行注入(inject)。但这不是必需的,因为已经存在 ConventionController 的 IMapping 属性。所以正如 Darin Dimitrov 所说,这将违反 DI 原则。

如何重构我的代码?我真的必须使用构造函数注入(inject)吗?

编辑2

我如何命令 StructureMap 来创建 HybridViewResult 的实例?如果这是可能的,那么 Controller 就不需要知道 IMapping 依赖项。是否有可能从 StructureMap 获取通用对象(未装箱)?

最佳答案

实际上,不,SetAllProperties() 对抽象类起作用。这是 Structuremap 实现中的一个弱点。我为你感到抱歉,就像我为我自己一样,属性注入(inject)不适用于基本抽象类。对于基础抽象类,您将需要使用构造函数注入(inject)(与这里的所有宣传相反,在满足依赖性时,这并不总是最好的方法)。

关于c# - 最佳实践 : StructureMap and ASP. NET MVC 2 - 抽象基 Controller 中的 Setter 注入(inject)/构造注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com