Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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#_.net_Oop_Domain Driven Design_Lookup Tables - Fatal编程技术网

C# 在业务逻辑中使用查找表的好方法是什么?

C# 在业务逻辑中使用查找表的好方法是什么?,c#,.net,oop,domain-driven-design,lookup-tables,C#,.net,Oop,Domain Driven Design,Lookup Tables,我被要求使用一个表来存储实体类型的状态。通常我以前总是使用枚举 有一种业务逻辑,其中实体的状态发生变化。该逻辑封装在实体中。当状态为枚举类型时,这很容易。但是现在我需要注入一个服务来获得所需的状态。我不知道将服务(如StatusService)注入该方法中,使该方法依赖于IStatusService是否是一个好主意 示例代码: public class MyEntity { public MyEntityStatus Status { set; get; } public vo

我被要求使用一个表来存储实体类型的状态。通常我以前总是使用枚举

有一种业务逻辑,其中实体的状态发生变化。该逻辑封装在实体中。当状态为枚举类型时,这很容易。但是现在我需要注入一个服务来获得所需的状态。我不知道将服务(如StatusService)注入该方法中,使该方法依赖于IStatusService是否是一个好主意

示例代码:

public class MyEntity
{
    public MyEntityStatus Status { set; get; }

    public void MethodInWhichStatusMayChange(IMyEntityStatusService myEntityStatusService)
    {
        //using myEntityStatusService to get the status when it should change
    }
}

public class MyEntityStatus
{
    public string Name { set; get; }
}

public interface IMyEntityStatusService
{
    MyEntityStatus GetStatusA();
    MyEntityStatus GetStatusB();
    MyEntityStatus GetStatusC();
}

最好在类构造函数中注入服务:

public class MyEntity
{
    private readonly IMyEntityStatusService myEntityStatusService;

    public MyEntity(IMyEntityStatusService myEntityStatusService)
    {
        this.myEntityStatusService = myEntityStatusService;
    }

    public MyEntityStatus Status { set; get; }

    public void MethodInWhichStatusMayChange()
    {
        //now you use the private myEntityStatusService field
    }
}

如果您决定使用依赖项注入引擎,这将使您的生活更轻松,而且您的代码将更干净、更易于使用(您不必传递
IMyEntityStatusService
的实例),并且正如注释中所指出的,更易于测试。

最重要的一点是,它是可测试的,并且易于执行单元测试:)@RanSasportas如果使用方法注入,它会变得不稳定吗?@SriramSakthivel方法注入也是可测试的,但构造函数注入更容易测试,因为大多数测试框架都支持这种开箱即用的模式。@jannagy02另一种选择是使用“工厂模式”。只有一种方法可以创建使用一些枚举参数化的状态
CreateStatus(EntityStatusEnumType)
@SriramSakthivel它对我有什么好处吗?在这种情况下,工厂应该依赖于服务。
MyEntityStatus
class有什么意义?它没有任何方法或抽象。这对IMHO不是很有用。关键是,数据库方面的工作人员不必查看我的枚举值,数据完整性也更好。那么代码生成呢?只需根据数据库值生成枚举。只要状态不是动态添加的,这就是一个很好的策略。