如何使用结构图(4.0)将依赖项注入到自定义属性中?MVC5 项目

本文关键字:自定义属性 注入 项目 MVC5 依赖 结构图 何使用 | 更新日期: 2023-09-27 18:36:44

我非常想做这家伙描述的事情(将依赖项传递到自定义属性中):

如何将依赖注入与属性一起使用?

但是,我想用StructureMap 4.0而不是Ninject来做。

我的项目是在我的Data Layer dll中使用自定义属性设置的,并且我已经安装了StructureMap并在UI Layer中使用了我的控制器

我已经确定我可能必须使用StructureMap进行Setter注入:

http://docs.structuremap.net/ConstructorAndSetterInjection.htm

但是,使用

数据层中的自定义属性对我来说,它无法正常工作。

我认为为了使事情正常进行,我也应该将Structuremap安装到我的数据层中,并将其放入IoC中.cs:

        public static IContainer Initialize()
    {
        Container container = new Container(x =>
        {
            x.ForConcreteType<My_AuthorizeADAttribute>().Configure.Setter<My_AppDataContext>().IsTheDefault();  //not sure about this line
        });
        return container;
    }

哦.. 我的自定义属性:

public class My_AuthorizeADAttribute : AuthorizeAttribute
{
    public IMy_Data_Context _dataContext;
    [SetterProperty] 
    public IMy_Data_Context DataContext
    {
        get { return _dataContext; }
        set { _dataContext = value;  }
    }

这是正确的做法吗? 我想我漏掉了一步。 (但话又说回来,我还没有真正在同一项目中的多个 dll 上设置 Structuremap。 想知道使用StructureMap的多个项目是否需要更多的东西。

目前,应用将运行,但不会填充自定义属性中的属性。

更新:这个StackOverflow问题很有帮助:

如何让 StructureMap 与 AngularJs/MVC5 和 WebApi2 Web 项目一起工作

如何使用结构图(4.0)将依赖项注入到自定义属性中?MVC5 项目

这确实是你不确定的线。

x.ForConcreteType<My_AuthorizeADAttribute>().Configure.Setter<My_AppDataContext>().IsTheDefault();  //not sure about this line

相反,这应该指定您在实例化时实际想要注入到资源库中的内容,如下所示:

x.ForConcreteType<My_AuthorizeADAttribute>().Configure.SetterDependency<IMy_Data_Context>().Is(new My_AppDataContext());

这会将你对IMy_Data_ContextMy_AppDataContext的具体实现注入到类型 My_AuthorizeADAttribute 中。如果您的属性上有多个IMy_Data_Context类型的属性,则可能需要担心如何使用您正在使用的默认语法分配多个默认值,但这似乎不是您的用例。

我在StructureMap Gitter房间回复了你,但我也会在这里做。创建属性对象后,是否对属性对象调用Container.BuildUp(object)?StructureMap 不会在运行时构建属性对象,它只能在之后应用资源库。有关 BuildUp() 的更多信息,请参阅本文的底部:http://structuremap.github.io/setter-injection/。

好的,经过大量研究,显然这是我现在的最佳选择。 这意味着属性依赖于StructureMap,但话又说回来,[SetterProperty]也会有它。

Asp.Net 带有结构图的 MVC 自定义验证属性