簡單注射器是否允許您在解析時將參數傳遞給構造函數?我想知道這兩個框架是否執行Unity的ResolverOverride或DependencyOverride。如何使用Simple Injector將參數傳遞給構造函數?
回答
我懷疑,這個問題是關於傳遞原始值構造函數當時服務實際上已經解決了。
讓我們建立一個簡單的測試類:
public interface IFoo
{
}
public class Foo : IFoo
{
public Foo(string value)
{
}
}
Foo類需要我們想解決的IFoo服務時提供一個字符串參數。
var container = new ServiceContainer();
container.Register<string, IFoo>((factory, value) => new Foo(value));
var firstFoo = container.GetInstance<string, IFoo>("SomeValue");
var secondFoo = container.GetInstance<string, IFoo>("AnotherValue");
如果我們希望能夠不直接使用的容器來創建Foo類的新實例,我們可以簡單地注入功能委託。
public interface IBar { }
public class Bar : IBar
{
public Bar(Func<string, IFoo> fooFactory)
{
var firstFoo = fooFactory("SomeValue");
var secondFoo = fooFactory("AnotherValue");
}
}
的「成分根」現在看起來是這樣的:
var container = new ServiceContainer();
container.Register<string, IFoo>((factory, value) => new Foo(value));
container.Register<IBar, Bar>();
var bar = container.GetInstance<IBar>();
如果問題是關於通過一個「靜態」的原始值的構造器,這是通過簡單地註冊一個工廠委託像做這個。
var container = new ServiceContainer();
container.Register<IFoo>((factory) => new Foo("SomeValue"));
var firstInstance = container.GetInstance<IFoo>();
var secondInstance = container.GetInstance<IFoo>();
不同之處在於,此方法不允許您在解析時傳遞值。該值在註冊時間靜態指定。
一切都很好。我只是不喜歡該行 container.Register
'container.Register
請問我們可以停止使用「foo」和「bar」嗎? –
可能與Simple Injector最簡單的方法是用委託註冊
[Test]
public void Test1()
{
Container container = new Container();
container.Register<IClassWithParameter>(() => new ClassWithParameter("SomeValue"));
var result = container.GetInstance<IClassWithParameter>();
}
public interface IClassWithParameter { }
public class ClassWithParameter : IClassWithParameter
{
public ClassWithParameter(string parameter)
{
}
}
注入原始的依賴關係的高級選項是詳細here
如果您的構造函數沒有任何其他依賴關係(或者您想手動解決這些依賴關係),上述方法將全部有效。如果你有以下情況,雖然它倒下:
public class Test : ITest
{
private IFoo _foo;
public Test(string parameter, IFoo foo)
{
_foo = foo;
....
}
}
現在,你不僅要手動進繩子,但也Foo
。所以現在你根本不使用依賴注入(真的)。還有簡單注射器狀態:
簡單注射器不允許將基元類型(如 整數和字符串)注入構造函數。
所以他們有點說不要這樣做。
這裏的另一個選擇是使用"Extensibillity points" for this scenario。
要做到這一點,你需要抽象你硬編碼元素從注入的元素:
public class Test : ITest
{
private IFoo _foo;
public Test(IFoo foo)
{
_foo = foo;
....
}
public void Init(string parameter)
{
}
}
您現在可以注入你的dependanices 和您的硬編碼元素:
_container.Register<ITest, Test>();
_container.RegisterInitializer<Test>(instance => {instance.Init("MyValue");});
如果你現在添加另一個依賴,您的注射現在將工作,無需您更新配置:
public class Test : ITest
{
private IFoo _foo;
private IBar _bar;
public Test(IFoo foo, IBar bar)
{
_foo = foo;
_bar = bar;
....
}
public void Init(string parameter)
{
}
}
- 1. 使用Simple Injector將構造函數傳遞給構造函數abd WebFormsMVP
- 2. 將參數傳遞給構造函數
- 3. 如何使用Ninject將參數傳遞給構造函數
- 4. 如何從主構造函數將參數傳遞給父構造函數?
- 5. 將構造函數傳遞給函數
- 6. 將函數傳遞給構造函數
- 7. 使用Ninject將參數傳遞給控制器構造函數
- 8. 使用Intent將參數傳遞給靜態構造函數
- 9. 如何將參數傳遞給策略的構造函數?
- 10. 如何將構造函數參數傳遞給Flask Blueprint?
- 11. 如何將參數傳遞給構造函數的服務
- 12. 如何將參數傳遞給非默認構造函數?
- 13. 如何將任意參數傳遞給javascript構造函數
- 14. MVVM:如何將參數傳遞給ViewModel的構造函數
- 15. 如何將參數傳遞給工廠元素構造函數?
- 16. 如何將參數傳遞給MvvmCross中的IOC構造函數?
- 17. 如何將參數傳遞給靜態類構造函數?
- 18. 如何將大量參數傳遞給構造函數?
- 19. 將數據傳遞給構造函數
- 20. 如何使用JNI將數據傳遞給構造函數
- 21. 將結構傳遞給構造函數
- 22. 將參數從不同的構造函數傳遞給類構造函數?
- 23. 將未知數的參數傳遞給js構造函數
- 24. 將所有參數傳遞給構造
- 25. 將enum傳遞給構造函數
- 26. 將所有參數傳遞給類構造函數並將參數傳遞給成員函數
- 27. 將ImageView傳遞給構造函數
- 28. 如何在使用.getClass()時將參數傳遞給構造函數?
- 29. 如何在使用IoC容器時將參數傳遞給構造函數?
- 30. 將NULL傳遞給構造函數
我認爲最好將問題分成兩個單獨的問題(每個框架一個)。這讓您更容易接受一個正確的答案,並且使其他人能夠更輕鬆地在相關容器中對此進行谷歌搜索。 – Steven