我在我的 MVC 应用程序中使用 Ninject 并尝试实现工作单元存储库模式。
具体来说,我已经定义了一个通用的 IUnitOfWork 接口,然后我想在其他一些(业务逻辑类)的构造函数中使用这个接口的一个实例。这是我的控制器的开始......
public class CompanyController : Controller
{
private readonly IUnitOfWork UnitOfWork;
private readonly ICompanyService CompanyDb;
private readonly IEmployeeService EmployeeDb;
public CompanyController(IUnitOfWork unitOfWork)
: base()
{
this.UnitOfWork = unitOfWork;
// This following construction is the problem...
this.CompanyDb = new ICompanyService(this.UnitOfWork);
this.EmpoloyeeDb = new IEmployeeService(this.UnitOfWork);
}
// Rest of Controller implementation
}
Controller 构造函数可以正常工作,但我想找到一种构建各种业务逻辑类的简洁方法,以便它们可以引用 UnitOfWork 对象中的存储库。
问题是我无法从接口实例化一个新的业务逻辑对象,即以下代码失败:
this.CompanyDb = new ICompanyService(this.UnitOfWork);
因为没有任何东西可以将 ICompanyService 接口“连接”到具体的实现。我想做的是使用 DI (Ninject) 创建 ICompanyService 的实例,其中物理类的构造函数如下所示:
public class CompanyService : ICompanyService {
private readonly UnitOfWork db;
public CompanyService(IUnitOfWork unitOfWork) {
this.db = unitOfWork as UnitOfWork;
}
}
最终解决方案 根据 Joshscorp 和 Dbaseman 的建议(谢谢),我的代码结构如下:
public class CompanyService : ICompanyService {
private readonly UnitOfWork db;
public CompanyService(IUnitOfWork unitOfWork) {
this.db = unitOfWork as UnitOfWork;
}
// Rest of implementation
}
public class CodeFirstController : Controller {
private readonly IUnitOfWork UnitOfWork;
private readonly ICompanyService CompanyDb;
private readonly IEmployeeService EmployeeDb;
public CodeFirstController(
IUnitOfWork unitOfWork,
ICompanyService companyDb,
IEmployeeService employeeDb
) : base() {
this.UnitOfWork = unitOfWork;
this.CompanyDb = companyDb;
this.EmployeeDb = employeeDb;
}
// Rest of implementation
}
Ninject 模块如下:
public class CodeFirstModule : NinjectModule {
public override void Load() {
string connectionString = ConfigurationManager
.ConnectionStrings["CompanyConnection"]
.ConnectionString;
Bind<CodeFirst.DAL.IUnitOfWork>()
.To<CodeFirst.DAL.EntityFramework.UnitOfWork>()
.InRequestScope()
.WithConstructorArgument("connectionString", connectionString);
Bind<CodeFirst.DAL.ICompanyService>()
.To<CodeFirst.DAL.EntityFramework.CompanyService>()
.InRequestScope();
Bind<CodeFirst.DAL.IEmployeeService>()
.To<CodeFirst.DAL.EntityFramework.EmployeeService>()
.InRequestScope();
}
}
IUnitOfWork 绑定上的“InRequestScope()”方法确保在依赖类 CompanyService 和 EmployeeService 的构造函数中使用 UnitOfWork 类的相同实例。
这正是我所寻找的——依赖服务类引用的 IUnitOfWork 对象的单个实例。