Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用castle windsor时的di问题_C#_Dependency Injection_Castle Windsor - Fatal编程技术网

C# 使用castle windsor时的di问题

C# 使用castle windsor时的di问题,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,我正在尝试使用windsor学习di,但遇到了一些问题。我有一个我正在使用的现有DAL,我想将di与此DAL一起使用。我有以下界面(为了这篇文章而简化)—— 以及实施—— public class Connection : IConnection { private DBManager manager = new DBManager(); public void OpenConnection(string ConnectionStringName)

我正在尝试使用windsor学习di,但遇到了一些问题。我有一个我正在使用的现有DAL,我想将di与此DAL一起使用。我有以下界面(为了这篇文章而简化)——

以及实施——

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);
        }
    }
这是我的温莎安装程序-

public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<IConnection>().ImplementedBy<Connection>()
                .LifeStyle.Transient
                );
        }
public void安装(IWindsorContainer,IConfigurationStore)
{
集装箱。登记(
Component.For().ImplementedBy()实现
.短暂的
);
}
这就是我注射的地方-

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;            
        }
    }
公共类GetData
{
私人IConnection conn;
公共获取数据()
{
}
公共获取数据(IConnection conn)
{
this.conn=conn;
}
公共列表GetAllData()
{
列表数据=新列表();
//i连接连接=新连接();
conn.OpenConnection(“connectionstringname”);
尝试
{
var r=conn.ExecuteReader(“选择…从…”);
//将读取器转换为数据列表的代码
r、 处置();
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
连接闭合连接();
}
返回数据;
}
}
注射无效。如果我单步执行代码,则在GetAllData中conn始终为null。 当我在安装程序中逐步执行时,IConnection/Connection依赖项就在那里,它表示所有必需的依赖项都可以解决

有人能看出我做错了什么吗?正如我所说,我是di新手,所以如果我使用不正确,请让我知道

谢谢

编辑 -我不完全确定我是否理解。如果我将安装程序更改为以下内容,它仍然不起作用-

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

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

            container.Resolve<GetData>();
container.Register(
Component.For().ImplementedBy()实现
.短暂的
);
集装箱。登记(
用于()的组件
);
container.Resolve();

与你所说的相比,我是否偏离了底线,或者我的方向是否正确?

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

container.Resolve
如果您使用过ASP.NET MVC,则可以自动使用它,但仍然需要将接口与某种工厂方法挂钩。在你的样品中我要加上

public class GetData
{
    private IConnection conn = ContainerManager.Instance.Resolve<IConnection>();
    //where ContainerManager.Instance points to the container instance
    ...
}
公共类GetData
{
私有IConnection conn=ContainerManager.Instance.Resolve();
//其中ContainerManager.Instance指向容器实例
...
}
您调用install()了吗?例如:

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

在哪里注册GetData?您需要在容器中注册
GetData
,然后从容器中解析它。如果您只是执行
new GetData()
container无法注入任何内容。Mauricio-感谢您的帮助,但我仍然不明白。请看上面的编辑-我走的方向对吗?@czuroski:是的,看起来不错。你能发布一个完整的测试用例,这样我就可以准确地定位你的问题吗?@Mauricio-我还没有编写任何测试用例……我还没有尝试编写任何测试用例,因为我不知道如何处理它们。我正在使用MVC,我的控制器注入工作正常。最好打电话给container.Resolution,是在你说的地方还是在我的WindsorController工厂?@czuroski哦,我明白了。我认为除了控制器注入之外,您不能使用ASP.NET MVC注入进行任何其他操作,因此我认为(可能不是真的),您不能使用它,因为ASP.NET具有内置工厂,这些工厂在后台自动连接。在我的项目中,我创建了一个包含所有
Resolve
逻辑的基类,并从这个基类继承类型。
container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());