2

我正在尝试在插件样式系统中使用 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)

4

2 回答 2

1

在它不起作用的情况下,你如何创建你的插件实例?你只是在做new FooPlugin()吗?

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

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

于 2012-12-28T20:21:33.133 回答
0

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

于 2012-12-28T20:12:24.743 回答