public interface IAuthenticationRepository
{
Task<IEnumerable<dynamic>> GetMenuItems(string groupIds);
}
public class AuthenticationRepository : Base, IAuthenticationRepository
{
public AuthenticationRepository(string sqlConnRep) : base(sqlConnRep) { }
public async Task<IEnumerable<dynamic>> GetMenuItems(string groupIds)
{
var menuAndFunctions = $@"select gfm.GroupId, fmm.MenuId, cm.MenuType, cm.MenuName, fmm.FunctionId,cf.FunctionName,
cf.Description, cf.IsDefault from FunctionMenuMapping fmm
inner join CoCMenu cm
on cm.Id = fmm.MenuId
inner join CoCFunction cf
on cf.Id = fmm.FunctionId
inner join GroupFunctionMapping gfm
on gfm.FunctionId = fmm.FunctionId
where gfm.GroupId in (" + groupIds + ")";
return await ExecQueryDynamic<dynamic>(menuAndFunctions);
}
为AuthenticationRepository
类创建实例并将实例分配给AuthenticationRepository
类对象
public class AuthenticationLogic : IAuthenticationLogic
{
readonly AuthenticationRepository authenticationRepository;
public AuthenticationLogic( AuthenticationRepository authenticationRepository)
{
this.authenticationRepository = new AuthenticationRepository("");
}
}
为AuthenticationRepository
类创建实例,并将实例分配给 IAuthenticationRepository
界面
public class AuthenticationLogic : IAuthenticationLogic
{
readonly IAuthenticationRepository IauthenticationRepository;
public AuthenticationLogic(IAuthenticationRepository IauthenticationRepository)
{
this.IauthenticationRepository = new AuthenticationRepository("");
}
}
他们之间有什么区别?两者都在做同样的事情。它有任何持久性差异吗?哪一个最好的方法?
答案 0 :(得分:1)
接口是一个契约,它允许您使用抽象而不是具体的实现,这意味着您的代码更加分离,并且更加可重用和可测试。第二个版本更好,因为传递接口意味着您的代码仅依赖于传入的对象符合“合同”的事实。由该界面提供。只要满足要求,构造函数就不应该关心实际对象是什么。这允许您在将来更改实施细节和类型,但只要您仍然实现该界面,您就不必更改该代码
答案 1 :(得分:1)
接口用于在您使用类的位置隐藏实现。使用它的类只知道接口而不知道它的实现。 这通常与依赖注入结合使用,其中所有属性都通过构造函数作为接口传入,并且您在应用程序的某个点注册哪个实现应该用于哪个接口。 这样可以轻松进行测试,就像在单元测试中一样,您可以创建类的测试实现,以便将测试传递给类,这样您就只测试类本身而不测试它的依赖性。这被称为模拟,并且有一些框架可以自动为您创建模拟。