我想在插件樣式系統中使用屬性注入的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)
?
在運行時加載程序集之後,所有情況下的所有插件都是通過Activator.CreateInstance(在構造函數中只有一個布爾值)創建的。我想我遵循你所說的話 - 我應該告訴集裝箱一旦建成就解決它們)。 –
是的,容器不知道你的類的任何內容,所以它需要是創建類的人,或者你必須調用BuildUp()。 –