2015-02-06 62 views
0

我有一個父級抽象服務,有自己的接口。如何使用構造函數參數註冊繼承服務?

public interface IParentService 
{ 
    void ParentMethod(object parameter); 
} 

public abstract class ParentService : IParentService 
{ 
    protected object _parameter; 

    public void ParentMethod() {} 

    public ParentService(object parameter) 
    { 
     _parameter = parameter; 
    } 
} 

而且我n服務繼承它,看起來像這樣:

public interface INthChildService 
{ 
    void NthChildMethod(); 
} 

public class NthChildService : ParentService, INthChildService 
{ 
    public void NthChildMethod() {} 

    public NthChildService(object parameter) : base(parameter) {} 
} 

我怎樣才能在服務定位器註冊自己的類型,同時保持構造函數的參數?可能嗎?

這裏是我的嘗試沒有成功,給我TypeNotRegisteredException : 'MyNamespace.INthChildService' is not registered or could not be constructed

var serviceLocator = ServiceLocator.Default; 
serviceLocator.RegisterType<IParentService, ParentService>(); 
serviceLocator.RegisterType<INthChildService, NthChildService>(); 

回答

1

Introduction to the ServiceLocator,章註冊類型的實例。

當服務具有構造函數參數時,您必須手動註冊一個實例,而不是隻註冊其類型。這樣您可以將所需的參數傳遞給RegisterInstance方法。

沒有必要在我的情況下注冊父服務,因爲它是抽象的,因此不會被注入到任何地方。

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     object parameter = new object(); 
     ServiceLocator.Default. 
      RegisterInstance<INthChildService>(new NthChildService(parameter)); 
    } 
} 
+0

而作爲一個額外的評論,你可以這樣做既自定義參數,並自動完成其他服務相結合: _typeFactory.CreateInstanceWithParametersAndAutoCompletion (參數); – 2015-02-06 11:01:23

+0

有趣的是,在這種情況下,自動補全意味着什麼? – Kilazur 2015-02-06 11:05:41

+1

如果您添加服務定位器中的其他參數,它們將自動追加。所以你可以有NthChildService(FirstObject obj,IRegisteredType1 type1,IRegisteredType2 type2等) – 2015-02-06 12:32:17