【问题标题】:Implement interface on Library Type in Xamarin project in C#在 C# 中的 Xamarin 项目中的库类型上实现接口
【发布时间】:2015-07-05 21:32:12
【问题描述】:

我正在使用 Xamarin 开发移动应用程序。目前该应用程序仅在 iOS 上运行,但计划将扩展到其他平台。出于这个原因,我有一个包含应用程序主要功能的可移植类库 (PCL),以及一个包含平台特定实现的 iOS 部分。我正在使用具有依赖注入的控制反转来针对 PCL 中包含的接口(例如)对平台项目中的实际实现进行编码。

实际的问题是,现在我需要在公共部分使用ConcurrentQueue,但这在PCL中是不可用的,所以我在PCL中使用依赖注入的方式如下:

public class A
{
    ...
    public IConcurrentQueue<T> ConcurrentQueue
    {
        get;
        set;
    }
    ...
}

public interface IConcurrentQueue<T>
{
    void Enqueue(T item);

    bool TryDequeue(out T result);

    int Count { get; }

    IEnumerator<T> GetEnumerator();
}

在我拥有的平台特定代码中:

public class Fake<T> : ConcurrentQueue<T>, IConcurrentQueue<T>
{
    //ugly 
}

...

A.ConcurrentQueue = new Fake<ActualType>();

它有效,但对我来说,声明一个“假”类只是为了使用控制反转似乎有点难看。最后,事实上,ConcurrentQueue&lt;T&gt; 已经实现了IConcurrentQueue&lt;T&gt;,即使是隐式的。有没有办法避免创建这个类?

【问题讨论】:

    标签: c# interface dependency-injection xamarin


    【解决方案1】:

    虽然这当然是一种可能的情况,但如果您的许多代码将使用 PCL 中不可用的功能,那么您可以改用“共享代码”风格的项目来获得全部功能,同时仍然实现重用您正在寻找的。​​p>

    【讨论】:

    • 其实到目前为止,PCL 方法已经相当不错了,因为将应用程序的逻辑与平台特定的实现分开并不难。当这不可能时,控制反转就可以了。不过,在这种情况下,这似乎有点矫枉过正:)
    • 当需要避免过于复杂的东西时,我在同一个项目中使用了两者。你的方法没有问题,但如果你需要做很多,那么共享代码可能更适合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2012-01-22
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2011-11-27
    • 2020-02-25
    相关资源
    最近更新 更多