从单个类公开不同的接口

本文关键字:接口 单个类 | 更新日期: 2023-09-27 18:14:34

我们正在尝试在DAL之上构建某种层,以便使用泛型公开特定存储库方法的接口。

例如:

public interface A
{
    void Do_A();
}
public interface B
{
    void Do_B();
}
public void Main()
{
     Exposer<A>.Do_A();
     Exposer<B>.Do_B();
}

这可能吗?

从单个类公开不同的接口

从技术上讲,这不是一个"单一类",因为Exposer<A>是不同的TypeExposer<B>;然而,最终,这与大多数IoC/DI容器看起来并没有太大的不同……如果这是StructureMap(仅作为示例),则可以考虑:

container.GetInstance<A>().Do_A();
container.GetInstance<B>().Do_B();
当然,您需要配置容器以知道具体的AB实现来自哪里!此处显示了StructureMap的选项,但是有很多选项可供选择。

如果你的意思是直接,那么:no。不能有:

class Exposer<T> : T {...} // non-working code to implement the interface T

可以,然而,有一些类:

class Exposer : A, B {...}

和cast:

A a = Exposer;
a.Do_A();
B b = Exposer;
b.Do_B();

类型Foo<T>不能实现(或扩展)实际的T,因为T在编译时是未知的。您可以做的是将T公开为属性,并在其上调用方法。然而,正如Ondrej所写的,这个问题可能有点不清楚。

你写的时候是在描述IoC吗?

Exposer<A>.Do_A();

你的expose类让我想到了StructureMap API:

ObjectFactory.GetInstance<T>().Do_A();

如果您想摆脱关键字new并以通用方式获得指定接口的实例,请查看本文或检查StructureMap

要在使用给定类时选择想要的接口实现,不需要使用泛型,只需将类强制转换为接口:

public interface A 
{ 
    void Do_A(); 
} 
public interface B 
{ 
    void Do_B(); 
} 
public class Exposer : A, B
{
    public void Do_A() { ; }
    public void Do_B() { ; } 
}
public void Main() 
{
     // the casts are redundant here,
     // because the interface implementation
     // is implicit
     ((A)Exposer).Do_A(); 
     ((B)Exposer).Do_B(); 
} 

如果想要排除不是给定接口成员的实现的成员,请使用显式实现:

public class Exposer : A, B
{
    void A.Do_A() { ; }
    void B.Do_B() { ; } 
}
public void Main() 
{
     // the casts are now required;
     // otherwise, you'll get a compiler error
     // telling you that the method is inaccessible
     ((A)Exposer).Do_A(); 
     ((B)Exposer).Do_B(); 
}