Dav*_*ean 6 .net c# dependency-injection asp.net-mvc-3 simple-injector
我要注入的动作过滤器就像这样开始
public class UserAuthorisation : AuthorizeAttribute
{
public IWcfClientProxy<IAppFrameworkServiceChannel>
FrameworkServiceProxy { get; set; }
Run Code Online (Sandbox Code Playgroud)
我已经像这样设置了我的容器:
container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(
()=> new WcfClientProxy<IAppFrameworkServiceChannel>());
container.RegisterInitializer<UserAuthorisation>(handler =>
{
handler.FrameworkServiceProxy = container
.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});
Run Code Online (Sandbox Code Playgroud)
当我运行它时,FrameworkServiceProxy属性为null.
我读过这篇文章:Simple Injector:在基类中注入一个属性并按照答案.我还在本页简单注入器文档中阅读了示例.
我不是注入基类,也许这就是问题所在?
我正在添加更多信息,因为我认为它应该是根据史蒂文斯的回答所说的.
我正在使用NuGet包用于MVC 3.这将以下内容添加到应用程序中:
public static class SimpleInjectorInitializer
{
/// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(() => new WcfClientProxy<IAppFrameworkServiceChannel>());
container.RegisterInitializer<UserAuthorisation>(handler =>
{
handler.FrameworkServiceProxy = container.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});
}
Run Code Online (Sandbox Code Playgroud)
这包括container.RegisterMvcAttributeFilterProvider();我现在理解的应该注册过滤器提供程序,并且应该意味着通过容器创建过滤器(这种理解可能是错误的)然后属性自动连线.
我的过滤器在Global.asax.cs中注册,如下所示:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new UserAuthorisation());
}
Run Code Online (Sandbox Code Playgroud)
在我看来,过滤器不是由容器创建的,所以我认为我需要做一些其他事情才能实现这一点?
我选择了Stevens作为答案,因为它让我得到了一个解决方案,我现在正在使用他在评论中提到的命令处理程序.
我已经做了一个简单的工作来注入我的全局过滤器.
在App_Start\SimpleInjectorInitializer.cs中我添加了RegisterGlobalFilters这样的:
public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
{
//Add simple injector resolved types.
filters.Add(container.GetInstance<UserAuthorisation>());
}
Run Code Online (Sandbox Code Playgroud)
在Initialize方法中我添加了这个RegisterGlobalFilters(GlobalFilters.Filters, container);
完整的方法如下所示:
/// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
RegisterGlobalFilters(GlobalFilters.Filters, container);
}
Run Code Online (Sandbox Code Playgroud)
正如我说的那么简单.只需从简单的注入器中获取我的实例,然后将它们添加到全局列表中,我相信有更好的方法可以做到这一点.
这种方式意味着您不需要更改global.asax.cs,这可能是一件好事.
您正在为您的属性注册一个初始值设定项UserAuthorisation。然而,初始化器仅在容器本身创建类型时由容器使用。由于属性是由 CLR 创建的,因此初始化程序不会执行。
SimpleInjector.Integration.Web.Mvc.dll(此 NuGet 包)包含一个RegisterMvcAttributeFilterProvider扩展方法。这将注册一个AttributeFilterProvider将执行隐式属性注入(并调用该container.InjectProperties方法)的对象。调用后container.RegisterMvcAttributeFilterProvider(),您将看到该属性被自动注入。
| 归档时间: |
|
| 查看次数: |
7761 次 |
| 最近记录: |