2012-12-28 54 views
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)

回答

0

你會爲自己省下不少麻煩,如果你只是走了相反的路線,並在contstructor(一個或多個)注入依賴關係。這種方式存在這樣的情況,你需要檢查,如果你的對象是正確初始化一個地方......

1

你是如何在情況下創建插件實例,其中它不工作?你只是在做new FooPlugin()

如果你VAR插件= ObjectFactory.GetInstance<PluginBase<AClass, BClass>>();,你得到的插件與所有正確的依賴關係解決?

如果您在使用實例化「新」的對象,容器沒有辦法知道的情況下需要解決的依賴關係 - 它沒有該實例的知識。可以這麼說,需要注入依賴項的實例必須由「容器管理」。

+0

在運行時加載程序集之後,所有情況下的所有插件都是通過Activator.CreateInstance(在構造函數中只有一個布爾值)創建的。我想我遵循你所說的話 - 我應該告訴集裝箱一旦建成就解決它們)。 –

+0

是的,容器不知道你的類的任何內容,所以它需要是創建類的人,或者你必須調用BuildUp()。 –

相關問題