繁体   English   中英

自动接线特性注入

[英]Auto-wiring property injection

我正在尝试在插件样式系统中为StructureMap使用属性注入。

ObjectFactory.Initialize(o => o.Scan(s =>
{
    s.AssembliesFromPath("path_to_assemblies");
    s.WithDefaultConventions();
});

这是一个示例实现(故意简化了T和TU的定义,因为它们只是简单的类)

public interface IBarService
{
    void Baz();
}

public class BarService : IBarService
{
    public void Baz() { /* implementation */ }
}


public abstract class PluginBase<T, TU> : IPlugin
    where T : AClass, new()
    where TU : BClass
{
     protected PluginBase()
     {
         //some init code in the constructor
     }
}

//Foo is created at run-time via Activator.CreateInstance()
public class FooPlugin : PluginBase<AClass, BClass>
{
   [SetterProperty]
   public IBarService BarService { get; set; }

   public void Fooey()
   {
       BarService.Baz();
   }
}

我想自动关联在运行时创建的所有这些插件的属性依赖关系。 我以为我将从属性注入开始,然后在需要时将其移至构造函数。

如果我做:

var obj = ObjectFactory.GetInstance<IBarService>();

FooPlugin实例中的任何地方,我都能获得正确的实现,一切都很好。

如果我做:

this.BarService.Baz();

我得到一个空引用异常,因为未设置IBarService实例。

创建插件后,如果执行以下操作:

ObjectFactory.BuildUp(pluginObject)

一切都很好, FooPlugin具有的正确实施IBarService

有什么方法可以让我简单地用[SetterProperty]装饰我的插件属性,并在创建插件时让StructureMap自动注入那些插件属性,而不必调用ObjectFactory.BuildUp(pluginObject)

在无效的情况下,如何创建插件实例? 您只是在做new FooPlugin()吗?

如果您执行var plugin = ObjectFactory.GetInstance<PluginBase<AClass, BClass>>(); ,您是否已解决所有正确的依赖关系的插件?

如果使用“ new”实例化对象,则容器将无法知道实例需要解决依赖关系-它不知道该实例。 可以说,需要注入依赖项的实例必须由容器“管理”。

如果您只走相反的路线,并将所有依赖项注入到构造函数中,将为您省去很多麻烦。 这样,您可以在一个地方检查对象是否正确初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM