从IValidatable对象调用我的Repository类是一种错误的方法

时间:2014-07-15 16:58:33

标签: asp.net .net asp.net-mvc asp.net-mvc-5

我的应用程序有两个字段IP& Mac,带有两个复选框,用于指示用户是否要检查他输入的IP和/或MAC地址是否唯一。我使用服务方法在post post action方法中进行检查。

但是这需要在我的Post Create和POST Edit动作emthods.so上重复相同的检查。我发现了另一种方法从我的动作方法中移动我的验证逻辑并将它们放在我的模型Ivalidatable对象中,如下所示: -

public class ConsoleServerJoin : IValidatableObject
    {
Repository repository = new Repository();
        public ITSYSConsoleServer ConsoleServer { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (ConsoleServer != null)
            {
bool IT360ipunique = repository.ISIT360IPUnique(NetworkInfo.IPAddress);
bool IT360macunique = repository.ISIT360MACUnique(NetworkInfo.MACAddress);
bool ITSYSipunique = repository.ISITSYSIPUnique(NetworkInfo.IPAddress);
bool ITSYSmacunique = repository.ISITSYSMACUnique(NetworkInfo.MACAddress);
                if ((IsIPUnique == true) && (!IT360ipunique || !ITSYSipunique))
                {
                    yield return new ValidationResult("Error occurred. The Same IP is already assigned.", new[] { "NetworkInfo.IPAddress" });

                }
                if ((IsMACUnique == true) && (!IT360macunique || !ITSYSmacunique))
                {
                    yield return new ValidationResult("Error occurred. The Same MAC Address is already assigned.", new[] { "NetworkInfo.MACAddress" });

                }
            }
        }

    }
}

所以我的问题是,从我的Ivalidatble对象调用我的模型库是否采用正确的方法,或者我应该只从控制器类中调用我的存储库类?

由于

1 个答案:

答案 0 :(得分:3)

  

所以我的问题是,从我的Ivalidatble对象调用我的模型库是否采用正确的方法,或者我应该只从控制器类中调用我的存储库类?

我不会说。存储库应该只处理数据访问(CRUD操作)。我会推荐一个中间&#34;服务&#34;具有存储库的层(BTW,您的存储库只是数据库上下文的副本吗?)并且具有与模型交互的方法。通过这种方式,可以更清晰地分离关注点,使您的代码更易于测试并且更易于维护,您仍然不必复制代码。您可以使用依赖注入将服务注入控制器,并将存储库注入服务中。

修改 通常,您将为您使用的每个实体(StudentRepository)提供通用存储库(Repository<T>)或存储库类。这些存储库知道如何获取,创建,更新,删除这些实体。您上面的存储库似乎有更多业务层类型方法的方法:

repository.ISIT360IPUnique(NetworkInfo.IPAddress);

这些类型的方法可能存在于您的服务层中。因此,控制器调用service,它有一个存储库。

查看存储库模式示例。 Here是contoso示例。这是一个很好的起点。