我是一个温莎诺布,我有一些问题让依赖注入工作。即时通讯使用asp.net Web应用程序。
我做了以下
public interface IHandler{
...
}
public class Handler : IHandler{
...
}
然后我尝试在global.asax application_start
中注册代码container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler))
.Named("handler"));
当我想使用Handler时,我创建了一个属性
public IHandler handler{get;set;}
但是当我尝试使用它时,它是空的?为什么?我错过了吗?
祝你好运
更新
我唯一注册/解决的是以下内容:
container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler))
.Named("handler"));
和
container.Resolve<IHandler>();
我是否需要做其他事情,是否可以运行此att应用程序启动?
更新2
这个问题可以解决,因为我试图依赖注入ascx控件吗?
答案 0 :(得分:4)
确保具有IHandler属性的组件也在Windsor中注册(和解析)。
您说这是一个ASP.NET应用程序。 Windsor组件的默认生活方式是单身。您确定要将此组件共享吗?您可能需要此组件的瞬态或每网络请求生活方式。
答案 1 :(得分:1)
尝试从注册中删除名称,如下所示:
container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler)));
或者,如果必须为组件命名,则可以将ServiceOverrides
用于使用类:
container.Register(Component
.For<SomeConsuer>()
.ServiceOverrides(new { handler = "handler" }));
答案 2 :(得分:1)
如果您要注册多个接口/服务,那么我建议按惯例注册(这在文档中推荐)。考虑一下:
container.Register(
AllTypes.FromAssemblyNamed("Assembly")
.Where(Component.IsInNamespace("Assembly.Namespace"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Transient));
此方法根据类型名称和接口名称执行匹配。更多信息Registering Components By Convention