自动接线属性注入

时间:2012-12-28 20:04:51

标签: c# dependency-injection structuremap

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

2 个答案:

答案 0 :(得分:1)

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

如果你做var plugin = ObjectFactory.GetInstance<PluginBase<AClass, BClass>>();,你是否得到了解决了所有正确依赖关系的插件?

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

答案 1 :(得分:0)

如果您只是走相反的路线并在contstructor中注入所有依赖项,那么您将省去很多麻烦。通过这种方式,您需要检查对象是否已正确初始化...