有什么区别:
private readonly Func<IDataService> _dataServiceCreator;
public FriendDataProvider(Func<IDataService> dataServiceCreator)
{
_dataServiceCreator = dataServiceCreator;
}
public Friend GetFriendById(int id)
{
using (var dataService = _dataServiceCreator())
{
return dataService.GetFriendById(id);
}
}
和
private readonly IDataService _dataService;
public FriendDataProvider(IDataService dataService)
{
_dataService = dataService;
}
public Friend GetFriendById(int id)
{
return _dataService.GetFriendById(id);
}
使用的数据服务是FileDataSrvice。据我所知,存在一些模式差异?
答案 0 :(得分:3)
类型Func<T>
表示返回T
的函数。因此,在第一个示例中,每次要GetFriendById
时,您正在创建新服务然后使用它,而第二个示例每次都使用相同的服务。如果你想避免长时间保留外部资源,第二个可能会更好。
答案 1 :(得分:2)
传递The system cannot find the path specified
可以让接口实现延迟实例化(或决定使用哪些实例)到实际需要的位置。传递Func<IService>
可以直接将两个实例绑定到您的班级。
IService
的一个常见用法是调整不同类型之间的生命周期。通常你有&#34;当前的Zzzzz&#34;只要服务(即当前用户,当前请求,当前窗口)与需要Zzzzz&#34;的服务相比,可能存在或不存在许多(可以存在整个应用程序的生命周期) - 如果您传递的Func<IService>
代码构成Func
可以找到&#34;当前&#34;服务需要它时的实例。
即。在Web应用程序中如果Func
是具有应用程序生命周期的单例类并且FriendDataProvider
的实现是特定于请求的,那么您可以让DI容器根据需要IDataService
创建IDataService
的实现版。如果您只是将Func
的实施方式传递给IDataService
,那么它会选择与某些任意请求相关联,并且无法在后续请求中正常运行。