相关疑难解决方法(0)

Castle Windsor:强制解析器使用指定的构造函数

这是一个例子:

interface IComponentA {};

class ComponentA : IComponentA { };

interface IComponentB { };

class ComponentB : IComponentB { };

interface IComponentC { };

class ComponentC : IComponentC
{
    public ComponentC(IComponentA a)
    {
        Console.WriteLine("Constructor A"); 
    }

    public ComponentC(IComponentB b) 
    {
        Console.WriteLine("Constructor B");
    }
};
Run Code Online (Sandbox Code Playgroud)

所有这些组件都在Castle Windsor容器中注册.

但是类ComponentC有2个重载的构造函数.ComponentC激活时可以使用它们中的任何一个.

我需要使用ComponentC(IComponentB b)构造函数.

我暂时使用UsingFactoryMethod()方法来解决这个问题:

container
    .Register(Component
        .For<IComponentA>()
        .ImplementedBy<ComponentA>())
    .Register(Component
        .For<IComponentB>()
        .ImplementedBy<ComponentB>())
    .Register(Component
        .For<IComponentC>()
        .UsingFactoryMethod(() => new ComponentC(
            container.Resolve<IComponentB>())));
Run Code Online (Sandbox Code Playgroud)

它有效,但可能Castle Windsor提供了一些更好的方法吗?

任何帮助都非常感谢.

谢谢.

.net c# dependency-injection castle-windsor ioc-container

7
推荐指数
1
解决办法
3334
查看次数

温莎城堡与多个建设者

我目前正在进行转换,从使用Ninject到当前版本的Castle Windsor,用于简单的C#.NET应用程序.

在大多数情况下,转换进展顺利,容器的实施已经完美无缺.但是我的存储库对象存在一个小问题.

我有一个用户存储库对象,以下列方式编码:

public class UserRepository : IUserRepository {
    public UserRepository(IObjectContext objectContext)  {
        // Check that the supplied arguments are valid.
        Validate.Arguments.IsNotNull(objectContext, "objectContext");

        // Initialize the local fields.
        ObjectContext = objectContext;
    }

    public UserRepository(IObjectContextFactory factory) 
        : this(factory.CreateObjectContext()) { 
    }

    // -----------------------------------------------
    // Insert methods and properties...
    // -----------------------------------------------
}
Run Code Online (Sandbox Code Playgroud)

为了对应这段代码,我在应用程序的配置文件中设置了以下条目:

<castle>
    <components>
        <component id="objectContextFactory" lifestyle="custom"
                   customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle"
                   service="Project.DAL.Context.IObjectContextFactory, Project.DAL.LINQ"
                   type="project.DAL.Context.ObjectContextFactory, Project.DAL.LINQ">
        </component>
        <component id="userRepository" lifestyle="custom"
                   customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle"
                   service="Project.BL.Repository.IUserRepository, Project.BL"
                   type="Project.BL.Repository.UserRepository, Project.BL.LINQ">
            <parameters>
              <factory>${objectContextFactory}</factory>
            </parameters>
        </component>
    </components>
</castle>
Run Code Online (Sandbox Code Playgroud)

对我来说,一切看起来都应该如此.当我尝试解析IObjectContextFactory服务的实例时,我检索一个ObjectContextFactory对象.当我尝试解析IUserRepository服务的实例时,我的问题出现了.我受到以下令人愉快的例外处理:

无法创建组件'userRepository',因为它具有要满足的依赖性.userRepository正在等待以下依赖项: …

c# constructor dependency-injection castle-windsor

6
推荐指数
1
解决办法
2991
查看次数