不确定如何正确执行此操作

时间:2018-08-12 00:37:41

标签: c# .net-core

好吧,所以我正在设计要在Windows或* Nix上运行的dotnet Core 2控制台应用程序。现在,我要弄清楚的部分是,我只想拥有一个代码库,然后让代码确定它是否在Win上运行,然后走一条路,或者在* Nix上走另一条路。

所以我在想的是创建一个接口,让我希望这两个路径的类看起来像属性和方法一样,然后创建一个Win和Nix类来实现该接口。

看起来很简单,但是我脑子rack绕的是如何基于OS精确地创建对象?我有“ IsWindows”和“ IsNix”的包装器代码,它们分别返回一个布尔值,因此我的想法是使用If语句来执行此操作。不确定如何创建通用全局变量,然后在条件语句中实例化它。

如果我不害怕被告知,也许我不在我的摇杆上,尝试在这里做一些奇怪的事情。我唯一的其他想法是在条件语句中执行工作,但这确实否定了我希望基于OS在条件条件中创建对象,然后使用实现Interface的类来调用相同的代码的愿望。不同的代码调用。

2 个答案:

答案 0 :(得分:0)

所以我觉得自己像个完全脑白痴。我只需要做一个接口类型的对象,然后在条件语句中将其设置为该类的实例。轻轻松松,不确定我为什么要在那上面放屁。

答案 1 :(得分:0)

具有通用接口和两个用于不同OS的类来实现它绝对是一种好方法。因此,假设您有

public interface IMyInterface
{
    void DoSomething();
}

public class WinClass: IMyInterface
{
    public void DoSomething()
    {
        //Implementation of DoSomething for Windows
    }
}

public class NixClass : IMyInterface
{
    public void DoSomething()
    {
        //Implementation of DoSomething for *nix
    }
}

根据特定条件实例化接口(或抽象类)的不同实现的常用方法是使用Factory pattern。可能看起来像这样:

public static class MyInterfaceFactory
{
    public static IMyInterface CreateMyInterface()
    {
        if (IsWindows)
            return new WinClass();
        else if (IsNix)
            return new NixClass();
        else
            throw new PlatformNotSupportedException();
    }
}

这是代码中唯一与平台相关的部分,其余代码将仅使用IMyInterface,并且与平台无关。您可以在需要创建实现IMyInterface的新实例时使用此工厂,也可以使用Singleton pattern确保为整个应用程序创建一个对象:

public static class MyInterfaceSingleton
{
    static MyInterfaceSingleton()
    {
        Instance = MyInterfaceFactory.CreateMyInterface();
    }

    public static IMyInterface Instance { get; private set; }

    // In C# 7, you can use just this instead:
    // public static IMyInterface Instance { get; } = MyInterfaceFactory.CreateMyInterface();
}

您的应用程序然后可以在需要时以平台无关的方式简单地调用MyInterfaceSingleton.Instance.DoSomething();