在Castle.Windsor中注册和解析命名实例

Sha*_*lez 4 dependency-injection castle-windsor named-entity-recognition c#-4.0

我似乎无法将正确的实例注入到类ctor中.这是我想要做的:

class Program
{
    static void Main(string[] args)
    {
        WindsorContainer container = new WindsorContainer();
        container.Register(
            Component.For<ISessionFactory>()
                .UsingFactoryMethod(() => GetSessionFactory("1"))
                .Named("1"),
            Component.For<ISessionFactory>()
                .UsingFactoryMethod(() => GetSessionFactory("2"))
                .Named("2"));

        container.Register(
            Component.For<IRepository>()
                .ImplementedBy<Repository>()
                .DependsOn(container.Resolve<ISessionFactory>("1")),
            Component.For<IReadOnlyRepository>()
                .ImplementedBy<ReadOnlyRepository>()
                .DependsOn(container.Resolve<ISessionFactory>("2")));

        var connectionString1 = container.Resolve<IRepository>().Factory.ConnectionString;
        var connectionString2 = container.Resolve<IReadOnlyRepository>().Factory.ConnectionString;

        //These should not be equal!!!
        Console.WriteLine(connectionString1);
        Console.WriteLine(connectionString2);
    }

    public static SessionFactory GetSessionFactory(string connectionString)
    {
        return new SessionFactory { ConnectionString = connectionString };
    }

    public static bool Blah(Type accepted)
    {
        int d = 3;
        return true;
    }
}

public interface ISessionFactory
{
    string ConnectionString { get; set; }
}

public class SessionFactory : ISessionFactory
{
    public string ConnectionString { get; set; }
}

public interface IRepository
{
    ISessionFactory Factory { get; set; }
}

public class Repository : IRepository
{
    public ISessionFactory Factory { get; set; }

    public Repository(ISessionFactory factory)
    {
        this.Factory = factory;
    }
}

public interface IReadOnlyRepository
{
    ISessionFactory Factory { get; set; }
}

public class ReadOnlyRepository : IReadOnlyRepository
{
    public ISessionFactory Factory { get; set; }

    public ReadOnlyRepository(ISessionFactory factory)
    {
        this.Factory = factory;
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能发现问题?

Mar*_*ijn 8

试试这个:

container.Register(
   Component.For<ISessionFactory>()
       .UsingFactoryMethod(() => GetSessionFactory("1"))
       .Named("1"),
   Component.For<ISessionFactory>()
       .UsingFactoryMethod(() => GetSessionFactory("2"))
       .Named("2"),
   Component.For<IRepository>()
       .ImplementedBy<Repository>()
       .DependsOn(Dependency.OnComponent(typeof(ISessionFactory),"1")),
   Component.For<IReadOnlyRepository>()
       .ImplementedBy<ReadOnlyRepository>()
       .DependsOn(Dependency.OnComponent(typeof(ISessionFactory), "2")));
Run Code Online (Sandbox Code Playgroud)

  • 由于您有两个实现 ISessionFactory 接口的组件,因此容器将默认解析注册的第一个组件。如果您需要不同的组件(如只读存储库所需),则必须通过引用组件的名称来指定。请参阅http://docs.castleproject.org/Windsor.Inline-Dependency.ashx?HL=dependson (2认同)