我正在使用以下部分创建一个 n 层应用程序。
- MyApp.DAL - 数据访问层(EF 5,SQL 后端)
- MyApp.BLL - 业务层
- MyApp.WcfService - 服务层
- MyApp.WpfClient - 前端
- MyApp.Models 是一个包含所有 POCO 的共享项目。
我将通过每一层给出一个“国家”实体的例子。首先是模型。请注意,StatefulObject 将帮助我跟踪来自断开连接的客户端的实体状态(根据 Julia Lerner 的编程 EF 第 2 版第 18 章)。
public class Country : StatefulObject
{
[Key]
[StringLength(2)]
public string Code { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
}
在 DAL 中,我有一个 ICountryRepository(基本 CRUD)和一个 CountryRepository。这是构造函数。
public class CountryRepository : ICountryRepository, IDisposable
{
MyDbContext _db;
public CountryRepository()
{
_db = new MyDbContext();
}
//Implement ICountryRepository (basically CRUD), etc...
}
我的 BLL 有一个 ICountryLogic、CountryLogic、IBusinessLayer 和 BusinessLayer,如下所示:
public class CountryLogic : ICountryLogic
{
ICountryRepository _countryRepository;
public CountryLogic(ICountryRepository countryRepository)
{
_countryRepository = countryRepository;
}
//implement ICountryLogic members, etc...
}
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer()
{
CountryLogic = new CountryLogic(new CountryRepository());
}
}
然后是一个示例服务方法,它实例化一个新的业务层并执行一些操作,如下所示:
public class CountryService : ICountryService
{
public IEnumerable<Country> GetAll()
{
IBusinessLayer bl = new BusinessLayer();
return bl.CountryLogic.GetAll();
}
//implement other service operations
}
然后 WPF 客户端可以像这样使用该服务:
CountryServiceClient countryService = new CountryServiceClient();
var countries = countryService.GetAll();
现在,在将 WCF 服务放在 BLL 和 WPF 前端之间之前,我的 WPF 前端可以只使用依赖注入,我不会有这样的丑陋:
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer()
{
CountryLogic = new CountryLogic(new CountryRepository()); // <<<< UGLY HERE
}
}
相反,我会像这样使用 DI 和构造函数注入:
public class BusinessLayer : IBusinessLayer
{
public ICountryLogic CountryLogic { get; set; }
public BusinessLayer(ICountryLogic countryLogic)
{
CountryLogic = countryLogic;
}
}
然后只需在 WPF 中的容器中注册接口和实现即可。我的问题是如何在类库中注册它们(在 BLL 中)?由于类库中没有组合根或入口点,我不知道该怎么做。我正在使用 SimpleInjector。
或者,我可以在 Wcf 服务中使用 DI,但这需要服务具有对 DAL 的引用,以便它可以将 ICountryRepository 注册到 CountryRepository。这似乎不对。服务层应该只引用 BLL,这就是我希望在 BLL 中设置 DI 的原因。谢谢。