温莎城堡IOC和Property Injection无法正常工作

问题描述 投票:0回答:2

正如Castle.Windsor Framework文档中所提到的,应该有可能通过使用属性注入来解析具有属性的基本类并解决依赖关系。我找不到解决方案,并且创建的解决方案仅适用于基本类/对象:

public class Class5
{
    public int Id { get; set; }
    public string Description { get; set; }
    public virtual Class9 Class9 { get; set; }
}


public class Class9
{
    public int Id { get; set; }
    public string Description { get; set; }
    public virtual Class10 Class10 { get; set; }
}

在程序中:

IWindsorContainer castle = new WindsorContainer();

castle.Register(Castle.MicroKernel.Registration.Component.For(typeof(Class5)));

var obj = castle.Resolve<Class5>();

obj.Description = "Hello Class5"; //works fine

其他依赖项未创建:

obj.Class9.Description = "Hello Class9"; // no object instance of Class9 created

有人有解决方案吗? 目的是只创建一个类的基本实例,并自动创建所有其他实例。也许另一个IOC框架更好? 该解决方案不应包含任何接口或存储库 - 对于此类情况,这只是一个简单的解决方案。

我已经尝试过Unity,并且它可以正常使用InjectionProperty和[Dependency] - Settings,但是使用IEnumerables或ICollections它最终会出现问题,所有未使用的对象都将通过使用实体框架(!)保存在数据库中作为空引用。 使用Castle.Windsor也应该没有问题,但我没有找到解决方案。

使用ICollection的Class5的替代方案:

public class Class5
{
    public int Id {get;set;}
    public string Description {get;set;}
    //public virtual Class9 Class9 {get;set;}
    public virtual ICollection<Class9> Class9{get;set;}
}
c# entity-framework dependency-injection inversion-of-control castle-windsor
2个回答
0
投票

Windsor无法创建Class9的实例,因为您尚未注册它。


0
投票

正如已经说过的here,Castle.Windsor不能创建除Class5之外的任何其他类,因为您没有注册任何其他类。

为此,您可以执行以下操作:

IWindsorContainer castle = new WindsorContainer();

castle.Register(Component.For<Class5>().LifestyleTransient());
castle.Register(Component.For<Class9>().LifestyleTransient());

现在当你打电话给castle.Resolve<Class5>()时,你也会得到一个Class9的例子。

如果你有更多的课程要注册,我建议你使用IWindsorInstaller

public class Bootstrapper
{
    public IWindsorContainer BootstrapperContainer()
    {
        IWindsorContainer castle = new WindsorContainer();
        return castle.Install(new Installer());
    }
}

public class Installer : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<Class5>().LifestyleTransient());
        container.Register(Component.For<Class9>().LifestyleTransient());
        //and so on
    }
}

还要确保使用正确的Lifestyle。默认情况下,Castle.Windsor使用LifestyleSingleton(),这可能不是您想要的行为。

有关可用生活方式的更多信息,请查看official documentation

© www.soinside.com 2019 - 2024. All rights reserved.