C# IoC预期接口的命名约定

C# IoC预期接口的命名约定,c#,unit-testing,oop,mocking,inversion-of-control,C#,Unit Testing,Oop,Mocking,Inversion Of Control,当您使用IoC框架时,您最终只能为IoC创建接口。我很想用一个命名约定来命名那些 例如,如果图中没有IoC,您可能具有以下业务域驱动结构: interface IBodyPart { string ScientificName { get; set; } string StreetName { get; set; } } class Head : IBodyPart { public string ScientificName { get; set; } pub

当您使用IoC框架时,您最终只能为IoC创建接口。我很想用一个命名约定来命名那些

例如,如果图中没有IoC,您可能具有以下业务域驱动结构:

interface IBodyPart
{
    string ScientificName { get; set; }
    string StreetName { get; set; }
}

class Head : IBodyPart
{
    public string ScientificName { get; set; }
    public string StreetName { get; set; }
}

class BodyPartPoker
{
    bool isSituationAcademic;
    BodyPartPoker(bool isSituationAcademic)
    {
        this.isSituationAcademic = isSituationAcademic;
    }

    void Poke(IBodyPart bodyPart)
    {
        if (this.isSituationAcademic)            
            Debug.Print($"Proceeding to poke {bodyPart.ScientificName}");            
        else            
            Debug.Print($"Poking that {bodyPart.StreetName} LOL");
    }
}
现在,假设您想使用IoC注入
BodyPartPoker
实例。您还需要使用某种单元测试模拟框架来测试该逻辑

在这种情况下,即使您没有业务领域案例,也将引入
IBodyPartPoker
接口:

interface IBodyPartPoker
{
    bool IsSituationAcademic { get; set; }
    void Poke(IBodyPart bodyPart);
}

class BodyPartPoker : IBodyPartPoker
{
我的问题是:像
IBodyPartPoker
这样的接口有一个命名约定,这样我们就明确地确定了它的目的是与业务领域无关,这有意义吗

interface IIocBodyPartPoker
在C#中,约定通常是利用语言的惯用命名约定,并使用前面的
I
命名接口,如
IBodyPartPoker
。这使得
BodyPartPoker
可以作为类的名称

在Java中,惯例是不使用匈牙利符号命名接口,因此该接口通常被命名为
BodyPartPoker
,这通常会导致人们将其单个类命名为
BodyPartPokerImp

你应该认为这是一种代码嗅觉,确切地说是因为似乎接口存在的唯一原因是启用单元测试。你可以说这违反了法律

给接口起另一个名字,比如
IIocBodyPartPoker
,并不能解决根本问题


如果存在一个专门支持单元测试的接口,那么您很可能会发现测试与实现细节过于耦合,并且每次尝试重构生产代码时,测试都会中断。同样,命名约定不会解决此类问题。

我认为这样做没有多大意义。我已经有了一种代码气味的印象,但是,我工作的环境中,这样说可能会引起很大争议。我在那种工作环境中是个新手,所以我会尽量按照现有的做法行事,除非我有很强的理由。我从团队和在线协议中了解到,大多数人并不介意仅仅为了国际奥委会而创建一个界面。现在我面临的挑战是如何将我的团队代码的重构版本进行PoC,它不会引入接口,因为同时还能工作。。。虽然是单元测试友好的。谢谢