如何使用 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_Context
、My_AppDataContext
的具体实现注入类型 My_AuthorizeADAttribute
。如果您的属性上有多个 IMy_Data_Context
类型的属性,您可能需要担心如何使用您正在使用的默认语法分配多个默认值,但这似乎不是您的用例。
我在 StructureMap Gitter 房间回复了你,但我也会在这里回复。你是在创建属性对象后调用 Container.BuildUp(object)
吗? StructureMap 不是在运行时构建属性对象,它只能在之后应用设置器。请参阅本文的底部:http://structuremap.github.io/setter-injection/ 了解有关 BuildUp() 的更多信息。
好的,经过大量研究,显然这是我现在的最佳选择。这意味着该属性依赖于 StructureMap,但话又说回来,[SetterProperty]
也会有它。
我非常想做这个人描述的事情(将依赖项传递到自定义属性):
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_Context
、My_AppDataContext
的具体实现注入类型 My_AuthorizeADAttribute
。如果您的属性上有多个 IMy_Data_Context
类型的属性,您可能需要担心如何使用您正在使用的默认语法分配多个默认值,但这似乎不是您的用例。
我在 StructureMap Gitter 房间回复了你,但我也会在这里回复。你是在创建属性对象后调用 Container.BuildUp(object)
吗? StructureMap 不是在运行时构建属性对象,它只能在之后应用设置器。请参阅本文的底部:http://structuremap.github.io/setter-injection/ 了解有关 BuildUp() 的更多信息。
好的,经过大量研究,显然这是我现在的最佳选择。这意味着该属性依赖于 StructureMap,但话又说回来,[SetterProperty]
也会有它。