C# 与内部静态类的接口
提供者类使用不同的模型,但我不想为每个模型创建具有相同功能的提供者我可以使用的c#最大值为4.0C# 与内部静态类的接口,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
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();