Luk*_*Led 2 asp.net-mvc dependency-injection ninject ninject-2 ninject.web.mvc
最近我转到MVC 3和Ninject 2.在大多数代码中,我使用构造函数注入,但是有一些地方,我必须使用Inject属性.Ninject 2注册自己的IDepencyResolver接口.我不喜欢DependencyResolver类是System.Web.Mvc命名空间的一部分,因为它的功能与MVC并没有真正的严格关系,但现在,当它存在时,我可以做
public SomeClass
{
public IUserService UserService { get; set; }
public SomeClass()
{
UserService = DependencyResolver.Current.GetService<IUserService>();
Run Code Online (Sandbox Code Playgroud)
代替
public SomeClass
{
[Inject]
public IUserService UserService { get; set; }
Run Code Online (Sandbox Code Playgroud)
所以我不必Ninject在我的类中引用命名空间.应该DependencyResolver这样使用?
我只使用属性注入来执行类的正常工作所不需要的依赖项,但是如果用户设置它们可以添加一些功能.此类功能的示例是日志记录.所以你可以拥有一个代表记录器的属性,用户可以在其中提供自己的实现,如果他没有,则该类继续正常工作,但它根本不记录.
对于其他一切,我使用构造函数注入.这样,您向消费者指示此类对某些其他服务具有必需的依赖性.
所以要回答你关于物业注入的问题,我会简单地说:
public SomeClass
{
public IUserService UserService { get; set; }
public void SomeMethodWhichDoesntEnforceUserService()
{
if (UserService != null)
{
// Provide some additional functionality
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有用户服务你的班级无法正常运作:
public SomeClass
{
private readonly IUserService _userService;
public SomeClass(IUserService userService)
{
_userService = userService;
}
public void SomeMethodWhichRequiresTheService()
{
_userService.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
所以在这两种情况下都没有参考任何DI细节.这就是控制倒置的全部意义所在.
| 归档时间: |
|
| 查看次数: |
2065 次 |
| 最近记录: |