在C#中创建注入构造函数的接口的最佳方法是什么?
我在一个项目中工作,外部数据从不同的来源获取,比如数据库、3个外部web API、web配置。 为了避免紧密耦合,在我的类构造函数中使用并传递了一些接口,例如:在C#中创建注入构造函数的接口的最佳方法是什么?,c#,interface,dependency-injection,strategy-pattern,C#,Interface,Dependency Injection,Strategy Pattern,我在一个项目中工作,外部数据从不同的来源获取,比如数据库、3个外部web API、web配置。 为了避免紧密耦合,在我的类构造函数中使用并传递了一些接口,例如: public Dog(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess, ITimezoneAccess timezoneAccess) public Cat(IDataAccess dataAccess, IConverter c
public Dog(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
public Cat(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
public Duck(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
它帮助我们进行单元测试,因为我们创建了这些接口的模拟实现
在开发代码时,所有类之间都有一些通用函数,如Datetime操作、固定值方法等。我决定创建一些静态类,将此功能划分为特定类,如DatetimeHelper、FixedCalculationHelper、StringHandlingHelper等
我得到的建议是避免使用这些静态类,将它们转换为带有接口的策略,并将它们作为其他外部数据访问接口传递到构造函数中
public Dog(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
public Cat(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
public Duck(IDataAccess dataAccess, IConverter converter, IConfigAccess configAccess,
ITimezoneAccess timezoneAccess)
公用狗(IDataAccess数据访问、IConverter转换器、IConfigaAccess配置访问、,
ITimezoneAccess timezoneAccess、IStringHandling stringHandler、,
IDatetimeHelper datetimeHelper…等欢迎任何评论或解释。请提前感谢。使用接口的目的是为抽象编码,而不是为消除依赖关系的具体编码
public class Duck
{
IDataAccess DataAccess { get; set; }
IConverter Converter { get; set; }
IConfigAccess ConfigAccess { get; set; }
ITimezoneAccess TimezoneAccess { get; set; }
public Duck()
{
// parameterless contructor
}
}
使用接口的目的是按照抽象而不是具体化进行编码,从而消除依赖关系
public class Duck
{
IDataAccess DataAccess { get; set; }
IConverter Converter { get; set; }
IConfigAccess ConfigAccess { get; set; }
ITimezoneAccess TimezoneAccess { get; set; }
public Duck()
{
// parameterless contructor
}
}
使用接口的目的是按照抽象而不是具体化进行编码,从而消除依赖关系
public class Duck
{
IDataAccess DataAccess { get; set; }
IConverter Converter { get; set; }
IConfigAccess ConfigAccess { get; set; }
ITimezoneAccess TimezoneAccess { get; set; }
public Duck()
{
// parameterless contructor
}
}
使用接口的目的是按照抽象而不是具体化进行编码,从而消除依赖关系
public class Duck
{
IDataAccess DataAccess { get; set; }
IConverter Converter { get; set; }
IConfigAccess ConfigAccess { get; set; }
ITimezoneAccess TimezoneAccess { get; set; }
public Duck()
{
// parameterless contructor
}
}
如果您不需要任何DI容器,对于助手,我建议您使用我所称的“抽象接口” 创建空接口:
public interface IDateTimerHelper { }
public interface IFixedCalculationsHelper { }
然后在扩展类中实现
public static class DateTimerHelperExtension
{
public static void HelpMeForDateTimering(this IDateTimerHelper dth/*, params*/)
{
//Help here;
}
public static void HelpMe(this IDateTimerHelper dth/*, params*/)
{
//Help here;
}
}
public static class FixedCalculationsHelperExtension
{
public static void HelpMeForFixedCalculations(this IFixedCalculationsHelper fch/*, params*/)
{
//implement here
}
public static void HelpMe(this IFixedCalculationsHelper fch/*, params*/)
{
//implement here
}
}
公共静态类DateTimerHelperExtension
{
public static void HelpMeForDateTimering(此IDateTimerHelper dth/*,参数*/)
{
//帮助这里;
}
公共静态void HelpMe(此IDateTimerHelper dth/*,参数*/)
{
//帮助这里;
}
}
公共静态类FixedCalculationHelperExtension
{
用于固定计算的公共静态void helpmeforFixedCalculationsHelper(此IFixedCalculationsHelper fch/*,params*/)
{
//在这里实施
}
公共静态void HelpMe(此IFExedCalculationHelper fch/*,params*/)
{
//在这里实施
}
}
最后用这个
public class Dog:IFixedCalculationsHelper,IDateTimerHelper
{
public Dog(/*other injections*/)
{
//Initialize
}
public void DoWork()
{
(this as IDateTimerHelper).HelpMe();
(this as IFixedCalculationsHelper).HelpMe();
this.HelpMeForDateTimering();
this.HelpMeForFixedCalculations();
}
}
公共类狗:IFExedCalculationHelper、IDateTimerHelper
{
公犬(/*其他注射*/)
{
//初始化
}
公共工作
{
(这是IDateTimerHelper);
(此为IFExedCalculationHelper)。HelpMe();
this.helpmeforatetimering();
this.HelpMeForFixedCalculations();
}
}
如果您不需要任何DI容器,对于助手,我建议您使用我所称的“抽象接口” 创建空接口:
public interface IDateTimerHelper { }
public interface IFixedCalculationsHelper { }
然后在扩展类中实现
public static class DateTimerHelperExtension
{
public static void HelpMeForDateTimering(this IDateTimerHelper dth/*, params*/)
{
//Help here;
}
public static void HelpMe(this IDateTimerHelper dth/*, params*/)
{
//Help here;
}
}
public static class FixedCalculationsHelperExtension
{
public static void HelpMeForFixedCalculations(this IFixedCalculationsHelper fch/*, params*/)
{
//implement here
}
public static void HelpMe(this IFixedCalculationsHelper fch/*, params*/)
{
//implement here
}
}
公共静态类