我在我的MVC应用程序中使用Ninject,并试图实现UnitofWork存储库模式。依赖类的构造函数注入
具体而言,我已经定义了一个通用的接口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
}
的控制器构造函数工作正常,但我想找到构建各种业务逻辑类的清洁方式,使他们可以在对象的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();
}
}
的 'InRequestScope()'方法确保在依赖类CompanyService和EmployeeService的构造函数中使用UnitOfWork类的相同实例。
这实现正是我一直在寻找 - 由相关服务类引用的IUnitOfWork对象的单个实例。
我不清楚你想知道什么。你说你喜欢找到一个干净的方式来构建各种类,以便他们可以引用存储库?但是,你目前的问题是什么?请更新您的问题与更多信息(也许更多的代码)。 – Steven