Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与内部静态类的接口_C#_Asp.net_.net - Fatal编程技术网

C# 与内部静态类的接口

C# 与内部静态类的接口,c#,asp.net,.net,C#,Asp.net,.net,提供者类使用不同的模型,但我不想为每个模型创建具有相同功能的提供者我可以使用的c#最大值为4.0 internal static class ProviderA { internal static void GetData(Action<string> callback) { callback?.Invoke(DataA.GetData()); } } internal static class ProviderB { interna

提供者类使用不同的模型,但我不想为每个模型创建具有相同功能的提供者我可以使用的c#最大值为4.0

internal static class ProviderA
{
   internal static void GetData(Action<string> callback)
    {
       callback?.Invoke(DataA.GetData());
    }
}
    internal static class ProviderB
{
   internal static void GetData(Action<string> callback)
    {
       callback?.Invoke(DataB.GetData());
    }
}


如何使代码更通用,但对提供程序使用相同的访问修饰符?

如果无法将原始提供程序修改为非静态,则适配器模式是您的朋友:

internal static class ProviderA
{
   internal static void GetData(Action<string> callback)
    {
       callback?.Invoke(DataA.GetData());
    }
}

internal static class ProviderB
{
   internal static void GetData(Action<string> callback)
    {
       callback?.Invoke(DataB.GetData());
    }
}

internal interface IProvider
{
    internal void GetData(Action<string> callback);
}

internal sealed class ProviderAWrapper : IProvider
{
    public void GetData(Action<string> callback)
    {
        ProviderA.GetData(callback);
    }
}

internal sealed class ProviderBWrapper : IProvider
{
    public void GetData(Action<string> callback)
    {
        ProviderB.GetData(callback);
    }
}
内部静态类ProviderA
{
内部静态void GetData(操作回调)
{
回调?.Invoke(DataA.GetData());
}
}
内部静态类提供程序B
{
内部静态void GetData(操作回调)
{
回调?.Invoke(DataB.GetData());
}
}
内部接口IProvider
{
内部void GetData(操作回调);
}
内部密封类提供程序包装:IProvider
{
public void GetData(操作回调)
{
ProviderA.GetData(回调);
}
}
内部密封等级提供器B断路器:I提供器
{
public void GetData(操作回调)
{
ProviderB.GetData(回调);
}
}
然后将接口注入数据类(构造函数是典型的)以使用它


ETA:如果您想集中共享功能,您甚至可以创建适配器的超类。

您可以使用C#继承的一个基本方面,即多态性。更一般地说,如果可以避免使用
static
,我相信您可以潜在地利用依赖注入和工厂模式

public class IDataContext : IDisposable
{
     Task<TEntity> Get<TEntity>();    
     Task Delete();
}
现在我们有了一种简单的方法来实现这些变化,因此我们将以以下方式使用:

var factory = new DataContextFactory();
using DataContextA a = factory.CreateContextA();
var value = await a.Get();

using DataContextB b = factory.CreateContextB();
var value = await b.Get();

await a.Delete();
await b.Delete();
您可以进一步修改此方法,但了解其益处取决于您和您的项目意图


重要的一点是,您可以是基本的,不必在工厂中包装并删除依赖项注入,但仍然可以利用基本的simpleton创建。

您的提供者需要是静态的有什么原因吗?@JohnathanBarclay好的,但是如果我将其更改为非静态的,那么我应该使用什么模式?好的,如果我要创建一个实例并将原始提供者更改为非静态提供者,那么我应该使用什么模式?直接实现接口即可。这个例子是一个1对1适配器,所以它只是删除一个层。
public class DataContextA : IDataContext
{
     public async Task<string> Get<string>() => ...
     public async Task Delete() => ...
}

public class DataContextB : IDataContext
{
    public async Task<int> Get<int>() => ...
    public async Task Delete() => ...
}
public class DataContextFactory 
{
     IDataContext CreateContextA() => new DataContextA();
     IDataContext CreateContextB() => new DataContextB();
}
var factory = new DataContextFactory();
using DataContextA a = factory.CreateContextA();
var value = await a.Get();

using DataContextB b = factory.CreateContextB();
var value = await b.Get();

await a.Delete();
await b.Delete();