在构造函数中传递Func <service>与Service

时间:2018-01-10 15:51:36

标签: c#

有什么区别:

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。据我所知,存在一些模式差异?

2 个答案:

答案 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,那么它会选择与某些任意请求相关联,并且无法在后续请求中正常运行。