Как реализовать инверсию управления с помощью Castle Windsor - PullRequest
0 голосов
/ 17 сентября 2010

У меня возникли проблемы с реализацией IOC с использованием windsor. У меня есть несколько различных реализаций класса доступа к данным, и я хочу использовать windsor, чтобы иметь возможность указать, какой класс доступа к данным использовать при использовании бизнес-объекта. Смотрите код ниже

public interface IPersistable
{
    bool Save();
    bool Delete();
}

public class Address
{
 public Address()
 {
 }

    public Address(IPersistable Factory)
    {
        this.DataAccess = Factory;
    }

    private IPersistable _DataAccess;

    public IPersistable DataAccess
    {
        get { return _DataAccess; }
        set { _DataAccess = value; }
    }
}

public class AddressFactoryUsingSQL : IPersistable
{

    public bool Save()
    {
        throw new NotImplementedException();
    }

    public bool Delete()
    {
        throw new NotImplementedException();
    }
}

public class AddressFactoryUsingWebService : IPersistable
{
    public bool Save()
    {
        throw new NotImplementedException();
    }

    public bool Delete()
    {
        throw new NotImplementedException();
    }
}

public class AddressFactoryUsingRepository : IPersistable
{
    public bool Save()
    {
        throw new NotImplementedException();
    }

    public bool Delete()
    {
        throw new NotImplementedException();
    }
}

Добавить, когда класс потребляется, используя следующее: Address addr = new Address(new AddressFactoryUsingSQL);

Я хочу использовать Виндзор, чтобы написать что-то похожее на:

    IWindsorContainer _Container= new WindsorContainer();
    _Container.Register(Castle.MicroKernel.Registration.Component.For<IPersistable>()); //this would retrieve the IPersistable class i want to use for the Address business object
    IPersistable addrF = _Container.Resolve<IPersistable>();
    Address addr = new Address(addrF);

как мне этого добиться? Я получаю сообщение об ошибке " Тип IPersistable является абстрактным. Таким образом, невозможно реализовать его как реализацию службы IPersistable "

Я хочу иметь возможность изменять метод доступа к данным, не меняя весь мой код. Кроме того, как я могу использовать web.config для этого?

Al

1 Ответ

1 голос
/ 17 сентября 2010

Проблема в том, что вы забыли упомянуть свой конкретный тип, реализующий IPersistable, следующий код должен работать:

IWindsorContainer container = new WindsorContainer();
container.Register(
   Component.For<IPersistable>()
     .ImplementedBy<AddressFactoryUsingSQL>());

И вы можете использовать его следующим образом:

var persistable = container.Resolve<IPersistable>();
...