如何使用 StructureMap (4.0) 将依赖项注入自定义属性? MVC5项目

How to inject a dependency into a custom attribute with StructureMap (4.0)? MVC5 project

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

How to use dependency injection with an attribute?

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

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

我确定我可能必须使用 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 的多个项目是否需要更多东西。

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

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

How do I get StructureMap working with an AngularJs / MVC5 and WebApi2 web project

确实是你不确定的线路

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

这应该指定您实际想要在实例化时注入 setter 的内容,如下所示:

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 不是在运行时构建属性对象,它只能在之后应用设置器。请参阅本文的底部:http://structuremap.github.io/setter-injection/ 了解有关 BuildUp() 的更多信息。

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