使用城堡温莎的di问题

时间:2011-05-20 12:32:43

标签: c# dependency-injection castle-windsor

我正在尝试使用windsor学习di并遇到问题。我有一个我正在使用的现有DAL,我想用这个dal使用di。我有以下界面(为了这篇文章而简化) -

public interface IConnection 
    {
        void OpenConnection(string ConnectionStringName);
        void CloseConnection();
        DbDataReader ExecuteReader(string query);
    }

和实施 -

public class Connection : IConnection
    {
        private DBManager manager = new DBManager();

        public void OpenConnection(string ConnectionStringName)
        {
            manager.OpenConnection("connectionstringname");
        }

        public void CloseConnection()
        {
            manager.CloseConnection();
        }

        public DbDataReader ExecuteReader(string query)
        {
            return manager.ExecuteReader(query, CommandType.Text);
        }
    }

这是我的windsor安装程序 -

public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<IConnection>().ImplementedBy<Connection>()
                .LifeStyle.Transient
                );
        }

这是我正在进行注射的地方 -

public class GetData
    {
        private IConnection conn;

        public GetData()
        {
        }

        public GetData(IConnection conn)
        {
            this.conn = conn;
        }

        public List<Entity> GetAllData()
        {
            List<Entity> data= new List<Entity>();
            //IConnection conn = new Connection();
            conn.OpenConnection("connectionstringname");

            try
            {
                var r = conn.ExecuteReader("select ... from ...");
                //code to convert reader to data list
                r.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.CloseConnection();
            }

            return data;            
        }
    }

注射不起作用。如果我单步执行代码,conn在GetAllData中始终为null。 当我逐步完成安装程序时,会出现IConnection / Connection依赖关系,它表示可以解决所有必需的依赖关系。

任何人都能看到我做错的事吗?正如我所说,我是迪新手,所以如果我使用不正确,请告诉我。

感谢

修改    - 我不完全确定我理解。如果我将安装程序更改为以下内容,它仍无法正常工作 -

container.Register(
                Component.For<IConnection>().ImplementedBy<Connection>()
                .LifeStyle.Transient
                );

            container.Register(
                Component.For<GetData>()
                );

            container.Resolve<GetData>();

与你所说的相比,我是否会偏离基地?或者我是朝着正确的方向前进的?

2 个答案:

答案 0 :(得分:1)

不确定,我可能错了,但我没注意到你打电话

container.Resolve

如果您使用过ASP.NET MVC,可以使用controller injection自动运行,但您仍需要将接口挂钩到某种工厂方法。在你的样本中我会添加

public class GetData
{
    private IConnection conn = ContainerManager.Instance.Resolve<IConnection>();
    //where ContainerManager.Instance points to the container instance
    ...
}

答案 1 :(得分:0)

你打电话给install()吗?例如:

container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());