Tại thời điểm này, tôi có một ControllerFactory tùy chỉnh vào mà tôi tiêm container của tôi Unity:Sử dụng Unity để tiêm phụ thuộc vào một tùy chỉnh ActionFilter
trong global.asax Application_Start():
var container = InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);
Trong máy điều khiển tôi đặt bộ điều khiển của tôi để sử dụng một ActionInvoker tùy chỉnh như sau:
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var controller = base.GetControllerInstance(requestContext, controllerType) as Controller;
if (controller != null)
controller.ActionInvoker = new UnityActionInvoker(_container);
return controller;
}
Cuối cùng trong ActionInvoker tùy chỉnh của tôi, tôi cố gắng để hành động tích tụ được gọi bằng các ActionInvokers container:
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
var builtUpFilters = new List<IActionFilter>();
foreach (IActionFilter actionFilter in filters)
{
builtUpFilters.Add(_container.BuildUp<IActionFilter>(actionFilter));
}
return base.InvokeActionMethodWithFilters(controllerContext, builtUpFilters, actionDescriptor, parameters);
}
Dưới đây là một ví dụ về một trong những ActionFilters đang được xây dựng:
public class PopulatRolesAttribute : ActionFilterAttribute, IActionFilter
{
private const string RolesKey = "roles";
[Dependency]
public Func<IMetadataService> Service { get; set; }
public PopulatRolesAttribute()
{
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.ViewData[RolesKey] == null)
{
filterContext.Controller.ViewData[RolesKey] = Service().GetRoles();
}
}
}
Vấn đề là rằng tài sản công cộng trên tùy chỉnh của tôi ActionFilterAttribute không bao giờ được tiêm với bất cứ điều gì, nó vẫn không được thực hiện! Tôi không thể thấy lý do bộ lọc của tôi không được vùng chứa tích hợp đúng cách. Loại được tiêm được đăng ký đúng cách, như vậy:
container.RegisterInstance(new ChannelFactory<IMetadataService>(
new BasicHttpBinding(),
new EndpointAddress("http://example.com/ABSApplication/MetadataService.svc")));
container.RegisterInstance<Func<IMetadataService>>(
() => container.Resolve<ChannelFactory<IMetadataService>>().CreateChannel());
Và cũng đang được tiêm ở nơi khác trong ứng dụng (Mặc dù không qua .Buildup). Đây là quá trình tương tự, tiếp theo là blog post. Tôi đang thiếu phần câu đố nào?
Ngoài sự tò mò, tại sao không thực hiện việc này, xác thực yêu cầu, yêu cầu preauth, v.v ... để chúng ở đó cho mỗi yêu cầu khi người dùng đăng nhập? –
Ý định ban đầu của tôi là đóng gói chức năng này để tôi có thể thêm nó bất cứ khi nào một hành động yêu cầu nó. Nếu sau khi xem xét, tôi sẽ sử dụng dữ liệu được các bộ lọc lấy ra một lượng đáng kể, tôi chắc chắn sẽ lưu trữ nó trên toàn cầu để tái sử dụng trong suốt ứng dụng. Nó thực sự là bắt đầu trông giống như đó sẽ là một giải pháp dễ dàng hơn anyway, bất kể tái sử dụng! Tôi vẫn còn rất tò mò là tại sao 'container.BuildUp' không hoạt động. –
Tôi đã tìm thấy mẫu này, sẽ sớm kiểm tra nó. Các nguồn có sẵn để tải về có cũng http://msdn.microsoft.com/en-us/gg618494 –