3

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

如何使用带有属性的依赖注入?

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

我的项目在我的 dll 中设置了自定义属性Data Layer,并且我已经安装了 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

3 回答 3

0

这确实是您不确定的路线。

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_Context这会将您的, ,的具体实现注入My_AppDataContext到类型My_AuthorizeADAttribute中。如果您的属性上有多个IMy_Data_Context类型的属性,您可能需要担心如何使用您正在使用的默认语法分配多个默认值,但这似乎不是您的用例。

于 2016-03-01T02:31:35.970 回答
0

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

于 2016-03-03T12:04:53.973 回答
0

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

Asp.Net MVC 自定义验证属性与 StructureMap

于 2016-03-03T21:49:54.773 回答