проблемы с ди с использованием замка Виндзор - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь научиться использовать виндзор и сталкиваюсь с проблемами.У меня есть существующий DAL, который я использую, и я хотел бы использовать di с этим dal.У меня есть следующий интерфейс (упрощенный ради этого поста) -

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);
        }
    }

Вот мой установщик виндзор -

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;            
        }
    }

инъекция не работает.Если я шагну по коду, в GetAllData conn всегда будет нулевым.когда я перехожу к установщику, там есть зависимость IConnection / Connection, и она говорит, что все необходимые зависимости могут быть разрешены.

Может кто-нибудь увидеть что-то, что я делаю неправильно?Как я уже сказал, я новичок в ди, поэтому, если я использую его неправильно, пожалуйста, дайте мне знать.

спасибо

РЕДАКТИРОВАТЬ - я не совсем уверенЯ понимаю.Если я изменю свой установщик на следующий, он все равно не будет работать -

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

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

            container.Resolve<GetData>();

Схожу ли я с базы по сравнению с тем, что вы сказали, или я иду в правильном направлении?

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Не уверен, и я могу ошибаться, но я не заметил, что вы звоните

container.Resolve

Если вы работали с ASP.NET MVC, вы можете получить эту работу автоматически с инъекцией контроллера, но вам все равно нужно подключить интерфейс к какому-либо заводскому методу.В вашем примере я бы добавил

public class GetData
{
    private IConnection conn = ContainerManager.Instance.Resolve<IConnection>();
    //where ContainerManager.Instance points to the container instance
    ...
}
0 голосов
/ 20 мая 2011

вы звонили установить ()? например:

container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...