自动布线属性注入

本文关键字:注入 属性 自动布线 | 更新日期: 2023-09-27 17:49:43

我试图在一个插件风格的系统中使用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"实例化对象,容器没有办法知道实例需要解析依赖关系——它不知道那个实例。需要注入依赖的实例必须"由容器管理"。

如果您采取相反的方法,将所有依赖项注入构造函数中,将省去很多麻烦。这样一来,你只需要在一个地方检查你的对象是否初始化正确…