我在我的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