从单个类公开不同的接口
本文关键字:接口 单个类 | 更新日期: 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>
是不同的Type
到Exposer<B>
;然而,最终,这与大多数IoC/DI容器看起来并没有太大的不同……如果这是StructureMap(仅作为示例),则可以考虑:
container.GetInstance<A>().Do_A();
container.GetInstance<B>().Do_B();
当然,您需要配置容器以知道具体的A
和B
实现来自哪里!此处显示了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();
}