Windsor Container: How to specify a public property should not be filled by the container?

后端 未结 7 1872
小鲜肉
小鲜肉 2021-01-01 23:32

When Instantiating a class, Windsor by default treats all public properties of the class as optional dependencies and tries to satisfy them. In my case, this creates a rath

7条回答
  •  别那么骄傲
    2021-01-02 00:02

    You can use the Castle.Core.DoNotWireAttribute attribute to stop a property from being wired up by the IoC container (this is in the Castle.Core assembly, which means your library only needs to take a dependency on the lightweight Castle.Core assembly - if for example you want to use the code without an inversion of control container altogether, or in a different IoC container).

    I don't believe there's any way to prevent wiring from occurring in the Xml configuration, but it would be reasonably easy to add support for this - if I had to do this I would probably:

    1. Introduce some kind of attribute on the property declaration in the xml:
    2. Inherit from PropertiesDependenciesModelInspector, overriding the InspectProperties method to apply some additional logic to identifying which properties should be added as dependencies to the components model (inspecting the model.Configuration for the wire="false" attribute/value pair).
    3. Inherit from DefaultComponentModelBuilder and override the InitializeContributors to include your replacement PropertiesDependenciesModelInspector - or just remove the existing properties contributor and add your own at run time via the AddContributor/RemoveContributor methods.
    4. Replace the ComponentModelBuilder service instance assigned to the kernel of your container.

    Another approach which could work for you is to just manually remove the dependencies from the model before any instances of the service are requested ie.

    kernel.GetHandler(typeof(MyComponent)).ComponentModel.Dependencies.RemoveAll(d => d.DependencyKey == "PropertyThatShouldNotBeWired");
    

    YMMV with that approach though - especially if you have startable services or other facilities which may be eagerly instantiating your component after it's registered.

提交回复
热议问题