好吧,所以我正在设计要在Windows或* Nix上运行的dotnet Core 2控制台应用程序。现在,我要弄清楚的部分是,我只想拥有一个代码库,然后让代码确定它是否在Win上运行,然后走一条路,或者在* Nix上走另一条路。
所以我在想的是创建一个接口,让我希望这两个路径的类看起来像属性和方法一样,然后创建一个Win和Nix类来实现该接口。
看起来很简单,但是我脑子rack绕的是如何基于OS精确地创建对象?我有“ IsWindows”和“ IsNix”的包装器代码,它们分别返回一个布尔值,因此我的想法是使用If语句来执行此操作。不确定如何创建通用全局变量,然后在条件语句中实例化它。
如果我不害怕被告知,也许我不在我的摇杆上,尝试在这里做一些奇怪的事情。我唯一的其他想法是在条件语句中执行工作,但这确实否定了我希望基于OS在条件条件中创建对象,然后使用实现Interface的类来调用相同的代码的愿望。不同的代码调用。
答案 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();
。