C# 自动布线特性注入

C# 自动布线特性注入,c#,dependency-injection,structuremap,C#,Dependency Injection,Structuremap,我试图在插件式系统中使用StructureMap的属性注入 ObjectFactory.Initialize(o => o.Scan(s => { s.AssembliesFromPath("path_to_assemblies"); s.WithDefaultConventions(); }); 这里是一个示例实现(故意不深入定义T和TU,因为它们只是简单的类) 我得到一个空引用异常,因为没有设置IBarService的实例 创建插件后,如果执行以下操作: Obj

我试图在插件式系统中使用StructureMap的属性注入

ObjectFactory.Initialize(o => o.Scan(s =>
{
    s.AssembliesFromPath("path_to_assemblies");
    s.WithDefaultConventions();
});
这里是一个示例实现(故意不深入定义T和TU,因为它们只是简单的类)

我得到一个空引用异常,因为没有设置
IBarService
的实例

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

ObjectFactory.build(pluginObject)

一切正常,
FooPlugin
正确实现了
IBarService


有没有办法让我用
[SetterProperty]
装饰我的插件属性,并让StructureMap在创建插件时自动注入这些属性,而无需调用
ObjectFactory.build(pluginObject)

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

如果插件实例不起作用,您如何创建插件实例?你正在做
新的FooPlugin()

如果您使用var plugin=
ObjectFactory.GetInstance(),您是否解决了插件的所有正确依赖关系


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

在运行时加载程序集后,所有情况下的所有插件都是通过Activator.CreateInstance(构造函数中只有一个布尔值)创建的。我想我是按照你说的去做的——我应该告诉容器在构建它们之后解析它们)。是的,容器对你的类一无所知,所以它要么是创建类的那个,要么你必须调用build()。
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>();
this.BarService.Baz();