Xamarin使用带有参数化构造函数的DependencyService

7
我该如何使用Xamarin Forms中的DependencyService通过参数化构造函数注入依赖项?

1
请问您能否发布完整的问题。包括您如何调用依赖服务来解决您的实现,或者您遇到的异常信息等。 - N Subedi
DependencyService只能使用默认构造函数。如果您需要更复杂的内容,您将需要使用不同的DI容器。 - Jason
1个回答

11

回答

你无法这样做。

装配属性实现仅适用于默认构造函数(也称为无参数构造函数),例如:[assembly: Dependency(typeof(MyClass))]

运行时实现也只能使用默认构造函数(即无参数构造函数),例如Xamarin.Forms.DependencyService.Register<T>()

编辑:(强调Nitha Paul在评论中的问题):Xamarin.Forms.DependencyService是一个服务定位器(Service Locator),而不是IoC容器, 服务定位器无法进行依赖注入。

建议

我建议您使用TinyIoC进行依赖注入。

以下是性能指标,显示TinyIoC是Xamarin.Forms最快的IoC工具: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; }
}

在应用程序中混合使用两个IOC容器是否可行?在我的应用程序中,我已经构建了很多功能。因此,更改当前实现可能是一项困难的任务。我想知道是否可以在需要时使用简单的IOC? - Nitha Paul
是的,你可以将IOC容器与Xamarin.Forms DependencyService混合使用。我已经在我的应用程序中使用Prism和Dryloc实现了这一点。 - GiampaoloGabba
1
听起来这里有两个问题,所以我会尝试回答两个问题:1. Xamarin.Forms.DependencyService不是IoC容器,而是服务定位器;2. 我建议在应用程序中使用一个IoC容器。如果您已经在使用SimpleIoC,请继续使用它。此答案仅显示使用TinyIoc的示例,但如果您喜欢其他IoC容器,例如SimpleIoC,请使用它!我不建议在同一个应用程序中同时使用TinyIoC和SimpleIoC。 - Brandon Minnick
@GiampaoloGabba 你能分享一些示例或描述你使用它的方式吗? - Nitha Paul
@Brandon Minnick:你能分享一些样例吗? - Nitha Paul
@NithaPaul 上面的答案中有一个如何使用TinyIoC的示例。 - Brandon Minnick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接