我有一个使用 Entity Framework 和 Ninject v2.2 的 MVC3 项目,并遵循工作单元模式,服务层包装了我的存储库。
在查看下面的代码之后,希望很明显 Ninject 正在使用构造函数链接来注入正确的类。它目前在我的应用程序中运行良好,但是我需要将 IDatabase 的实例绑定到具有不同范围的 MyDatabase,例如 InSingletonScope() 或 InNamedScope(),而不是 InRequestScope()。我知道我可以使用 [Named("MyDatabaseScope")] 属性来自定义注入哪个 IDatabase 对象,但是似乎对于我的代码结构,如果我想注入我的 SingletonScoped 实例,我将不得不重新创建一个新的 Abstract我的工作单元、我的服务和我的所有存储库的具体实现,然后将链接下来。
基本上我的应用程序目前正在
控制器 -> 工作单元 -> 数据库,(存储库 -> 数据库)
如果我必须更改我的数据库绑定,我现在必须在当前链之外创建另一个链:
Controller -> New Unit of Work -> SingletonDatabase, (New Repositories-> SingletonDatabase)
这似乎完全击败了 DRY 校长。有没有办法从 Controller Constructor 通知 Ninject 在进行构造函数链接时它应该使用我的单例(或命名绑定)而不是我的请求范围绑定,而不必使用命名属性或新的属性重新创建我的所有类界面?
抱歉,文字太长了,我不确定如果没有我的代码片段和我有些漫不经心的解释,我是否能理解这一点。
Ninject 模块加载功能:
..snip..
Bind<IUserServices>().To<UserServices>();
Bind<IBaseServices>().To<BaseServices>();
Bind<IUserRepository>().To<UserRepository>();
Bind(typeof (IRepository<>)).To(typeof (RepositoryBase<>));
Bind<IUnitOfWork>().To<UnitOfWork>();
Bind<IDatabase>().To<MyDatabase>().InRequestScope();
//This is my problem:
//Bind<IDatabase>().To<MySingletonDatabase>().InSingletonScope();
工作单元实施构造器:
public class UnitOfWork : IUnitOfWork
{
private IDatabase _database;
public UnitOfWork(IDatabase database,
IUserRepository userRepository,
IPeopleRepository peopleRepository,
)
{
this._database = database;
this.UserRepository = userRepository;
this.PeopleRepository = peopleRepository;
}
protected IDatabase Database
{
get { return _database; }
}
...snip...
}
用户服务层实现构造器:
public class UserServices : BaseServices, IUserServices
{
private IUnitOfWork _uow;
public UserServices(IUnitOfWork uow)
: base(uow)
{
_uow = uow;
}
...snip...
}
用户存储库构造函数:
public class UserRepository : RepositoryBase<User>, IUserRepository
{
public UserRepository(IDatabase database)
: base(database)
{
}
...snip...
}
控制器构造函数:
public IUserServices _userServices { get; set; }
public ActivityController(IUserServices userServices)
{
_userServices = userServices;
}
}