Инъекция зависимости WCF с использованием Castle Windsor - Помогите, пожалуйста? - PullRequest
2 голосов
/ 13 октября 2010

У меня есть служба WCF, которая вызывает бизнес-компонент, который вызывает хранилище, и у меня есть возможность закончить работу с использованием Castle Windsor, используя его WCF Facility.

Регистрация WCF Facility и оставшаяся часть регистрации компонентапроисходит в файле Global.asax, как это.


    public class Global : System.Web.HttpApplication
    {
        public IWindsorContainer SystemContainer;

        protected void Application_Start(object sender, EventArgs e)
        {
            RegisterDependencies();
        }

        private void RegisterDependencies()
        {
            SystemContainer = new WindsorContainer();


            SystemContainer.AddFacility<WcfFacility>().Register(
                Component.For<IBookingRepository>().ImplementedBy<BookingRepository>(),
                Component.For<IBookingBll>().ImplementedBy<BookingBll>(),
                Component.For<IBookingService>().ImplementedBy<BookingService>(),
                Component.For<ILogger>().ImplementedBy<Logger>()

                );
        }

    }

Все хорошо, но теперь мне нужно сослаться на этот контейнер в одном из моих компонентов, чтобы я мог разрешить другие компоненты, как это.

</p>




 public class BookingBll : IBookingBll
    {
        private IBookingRepository _repository;
        private ILogger _logger;

        public BookingBll(IBookingRepository repository)
        {
            _repository = repository;
            _logger = SystemContainer.Resolve<ILogger>(); // This will not 
            //compile as we can't access a Global class property.
        }

        public void Add(Booking booking)
        {
            //Some implementation;
            _logger.Write();
        }
    }

Более того, я хочу, чтобы этот контейнер был доступен глобально, и не хочу многократно запускать регистрацию, поэтому я должен изучить шувинг этого контейнера в HttpRuntime.Cache, чтобы он был доступен и любой компонент мог просто получитьэто из Cache и решить, какой интерфейс они хотят.

Прошу прощения за мое невежество, так как я новичок в WCF, а также Castle Windsor, и вся архитектура была заткнута в мое горло с крутым сроком: - (

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Вы можете зависеть от IKernel, он автоматически предоставляется Windsor.

 public BookingBll(IKernel kernel, IBookingRepository repository) {}

Если вам действительно, действительно нужен IWindsorContainer, вы можете зарегистрировать его в контейнере, саморегистрацию, если хотите :-)

SystemContainer.Register(Component.For<IWindsorContainer>.Instance(SystemContainer));

Тогда ваш ctor станет:

public BookingBll(IWindsorContainer container, IBookingRepository repository) {}

Обычно не одобряется зависимость от контейнера / ядра, лучше вводить нужные вам компоненты, так как это сделает вашЗависимости намного понятнее и ваш код тестируемый.Взять зависимость от контейнера - это все равно, что сделать Global.SystemContainer общедоступным статическим и ссылаться на него из любого места в вашем приложении.

В вашем примере, ILogger (если это Castle.Core.ILogger) может быть введен LoggingFacility.Нет необходимости решать это самостоятельно.

0 голосов
/ 13 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...