请注意,本站并不支持低于IE8的浏览器,为了获得最佳效果,请下载最新的浏览器,推荐下载 Chrome浏览器
欢迎光临。交流群:166852192

在Orchard中属性注入


由于每个人都在使用Orchard开发应用程序,因此Orchard中的构造函数注入是一个内置的功能。它在整个框架中广泛使用,并使开发人员的生活方式更容易。但有一些情况下,它是不够的,可能想做属性注入。最常见的原因是有循环依赖的危险,讨厌的东西很难跟踪,有时很难修复...


物业注入来救援,但它不是一个在乌节出来的东西。框架不试图强制地填充我的对象属性是确定的 - 属性注入应该只用作替代ctor注入,并且只在某些情况下。


有两种方法使用Orchard中的容器来填充对象属性,我发现这些实例最有用:


在对象的级别(需要填充的属性) - 使用Autofac的IComponentContext.InjectUnsetProperties(object)方法。
在全局级别 - 通过Autofac.Module实现


对象级属性初始化
如果你想仅注入一个特定对象的属性,这是一个很好的方法。


这种方法需要你先将IWorkContextAccessor对象注入到构造函数中。 让我们调用这个对象'context'。 填充对象就像调用context.Resolve <IComponentContext>()。InjectUnsetProperties(this)一样简单。 你可以做到,无论你想,例如。 在你的对象初始化发生的地方。 当然,通过调用在构造函数中看出来 - 你可能很容易遇到循环依赖问题。 这意味着在对象被构造之后被调用。


当然,你可以将任何对象传递给InjectUnsetProperties方法,并将其属性填充。
全局级属性注入
如果要对容器中注册的所有对象执行属性注入,请使用此方法。


这是一个更复杂的解决方案,因为它需要您创建一个Autofac.Module类的实现并插入容器构建过程。 但没什么可怕的


首先我们需要创建和实现Autofac.Module类和覆盖方法AttachToComponentRegistration(IComponentRegistry componentRegistry,IComponentRegistration registration)。


下一步是挂接给定IComponentRegistration的Activated事件,并向其传递一个事件处理程序,它将注入一个处理对象的所有未设置的属性。 这里是代码:
public class MyModule : Module {    
protected override void AttachToComponentRegistration(        
IComponentRegistry componentRegistry, 
        IComponentRegistration registration)
    {
        registration.Activated += (s, e) 
            => e.Context.InjectUnsetProperties(e);
    }
}
没有什么,没什么,更少,非常简单的东西,我告诉你这只是一个简单的例子,当然 - 你可以把更多的花哨的逻辑里面,如果你需要(例如只作用于特定的对象等)。



我最近发布了一个关于SO的答案,关于在Orchard实现属性注入。 它是关于填充特定类型的属性,留下其他属性不变 - 一些更复杂的东西。 如果这是你的情况 - 看看。 我提供的解决方案基于Orchard.Logging.LoggingModule,它注入ILogger实现。



作者原创内容不容易,如果觉得内容不错,请点击右侧“打赏”,赏俩给作者花花,也算是对作者付出的肯定,也可以鼓励作者原创更多更好内容。
更多详情欢迎到QQ群 166852192 交流。