在Windows窗体应用程序中使用Castle Windsor

4

我想在Windows窗体应用程序中使用Castle IOC添加记录器。

我像下面这样注册了记录器:

static class Program
{
    [STAThread]
    static void Main()
    {
        IWindsorContainer container = new WindsorContainer().Install(FromAssembly.This());

        container.Register(Component.For<ICommonLogger>().ImplementedBy(typeof(CommonLogger)).LifeStyle.Singleton);
        container.Kernel.Resolver.AddSubResolver(new EAE_Automation.COM.LoggerResolver(container.Kernel));

    } 
}  

在应用程序的另一个表单中,我尝试将日志记录器作为属性使用,但它在程序中为空。

namespace Test.KNXManagement
{
    public partial class Test: Form
    {
        public ICommonLogger Logger { get; set;} 

        public Tunneling()
        {
            Logger.Info("Testing.......................");

        }

    }
}

我觉得我在这里漏掉了一个重要的点。


ICommonLogger 依赖项移动到 Test 表单的构造函数中,并从容器中解析此表单。这样可以在解析表单时找出配置错误。 - Steven
你把 Logger 从私有字段改成公共属性后,它还是不工作吗?你如何注册你的 Test 类,它是如何解决的? - Andreas H.
你尝试过在将其添加到容器后使用 Logger = container.Resolve<ICommonLogger>(); 吗? - aevitas
@RyuKaplan ICommonLogger 是一个接口还是一个类? - aevitas
@RyuKaplan 好的。我刚刚尝试了我下面粘贴的代码,对我来说完美地运行了,你也试试吧。另外,你是从NuGet使用Castle Windsor吗? - aevitas
显示剩余3条评论
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
我还注册了Form类来解决子依赖关系。
    container.Register(Classes.FromThisAssembly().BasedOn<Form>());
然后按照以下方式运行应用程序。
    Application.Run(container.Resolve<Test>()); 

这解决了我的问题。

感谢大家。


0
以下代码基于你的代码,对我来说完全正常运行:
    private static IWindsorContainer _container;
    static Program()
    {
        Debug.Listeners.Add(new ConsoleTraceListener());

        _container = new WindsorContainer().Install(FromAssembly.This());

        _container.Register(Component.For<ICommonLogger>().ImplementedBy(typeof(CommonLogger)).LifeStyle.Singleton);
    }

    private static ICommonLogger Logger { get; set; }
    private static void Main(string[] args)
    {
        Logger = _container.Resolve<ICommonLogger>();

        Logger.Write("Text");

        Console.ReadLine();
    }

    public interface ICommonLogger
    {
        void Write(string str);
    }

    public class CommonLogger : ICommonLogger
    {
        public void Write(string str)
        {
            Console.WriteLine(str);
        }
    }
程序在控制台的输出是文本

我应该从“表单”中解决记录器。也许这对我来说与你的情况不同。 - Barış Velioğlu
那么你是如何在表单中解决它的呢? - aevitas
我认为,我应该先注册所有的窗体。如果我注册它们,那么记录器就可以被解析了。也许我应该为此开一个新问题。 - Barış Velioğlu
@Ryu Kaplan:当然,如果您也是从容器中获取表单的话,那么表单内的记录器才能被自动解析。但是,如果您使用了 new Form(),那么容器又该如何发挥作用呢? - Andreas H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,