带有参数化构造函数的 Xamarin DependencyService [英] Xamarin DependencyService with Parameterized Constructor
问题描述
如何使用 Xamarin Forms DependencyService 通过参数化构造函数注入依赖项?
How I can use Xamarin Forms DependencyService to inject dependency through Parameterized Constructor ?
推荐答案
答案
你不能.
程序集属性实现仅适用于默认构造函数(又名无参数构造函数),例如[assembly: Dependency(typeof(MyClass))]
.
The assembly attribute implementation only works with default constructors (aka parameterless constructors), e.g.[assembly: Dependency(typeof(MyClass))]
.
运行时实现也仅适用于默认构造函数(又名无参数构造函数),例如 Xamarin.Forms.DependencyService.Register
The run-time implementation also only works with default constructors (aka parameterless constructors), e.g Xamarin.Forms.DependencyService.Register<T>()
编辑:(突出显示Nitha Paul 在评论中提出的问题):Xamarin.Forms.DependencyService
是一个 服务定位器,而不是IoC 容器,服务定位器不能做依赖注入.
Edit: (Highlighting Nitha Paul's question in the comments): Xamarin.Forms.DependencyService
is a Service Locator, not an IoC Container, and Service Locators cannot do Dependency Injection.
我建议使用 TinyIoC 进行依赖注入.
I recommend using TinyIoC for your Dependency Injection.
以下是显示 TinyIoC 是 Xamarin.Forms 最快的 IoC 工具的性能指标:https://github.com/jsuarezruiz/xamarin-forms-perf-playground#ioc
Here are performance metrics showing TinyIoC is the fastest IoC tool for Xamarin.Forms: https://github.com/jsuarezruiz/xamarin-forms-perf-playground#ioc
public class App : Xamarin.Forms.Application
{
public App()
{
// Register DI
TinyIoCContainer.Current.Register<INumber>(new NumberClass(42));
TinyIoCContainer.Current.Register<MyClass>();
// Resolve DI
var myClass = TinyIoCContainer.Current.Resolve<MyClass>();
Console.Writeline(myClass.ToString()); //42
}
}
public class MyClass
{
readonly INumber _number;
public int MyClass(INumber number)
{
_number = number;
}
public override ToString() => _number.Num;
}
public class NumberClass : INumber
{
public NumberClass(int number)
{
Num = number;
}
public int Num { get; }
}
public interface INumber
{
int Num { get; }
}
这篇关于带有参数化构造函数的 Xamarin DependencyService的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!