Виндзорский завод WCF? - PullRequest
       2

Виндзорский завод WCF?

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

Таким образом, в настоящее время у меня есть мастер-класс DAO ITrackingToolDAO, который имеет все контракты на обслуживание для каждого из моих бизнес-объектов.

public partial interface ITrackingToolDAO {
    void Open(string connectionString);
    void Close();

    IBusinessFunctionDAO BusinessFunction { get; }
    IBusinessUnitDAO BusinessUnit { get; }
    IProgramBudgetDAO ProgramBudget { get; }
    IProjectDAO Project { get; }
    ...
}

Мой сервисный контракт выглядит так

[ServiceContract(Namespace="http://bmgops.qintra.com/Tracking/v1/BusinessFunction")]
public partial interface IBusinessFunctionDAO {

    [OperationContract]
    BusinessFunction GetBusinessFunction(Int32 businessFunctionId);

    [OperationContract]
    IEnumerable<BusinessFunction> Find(string filter);

    [OperationContract]
    SaveEventArgs<BusinessFunction>Save(BusinessFunction businessFunction);
}

Iв настоящее время есть 2 конкретные реализации моего интерфейса ITrackingToolDAO.Первый - TrackingToolSqlDAO , который создает конкретный SQL DAO для каждой сущности.ie) BusinessFunctionSqlDAO , ProjectSqlDAO и т. д.

Второй - TrackingToolWCFDao , который создает прокси WCF с использованием ChannelFactory чтобы создать реализацию для всех моих членов DAO.

Теперь я хочу начать использовать средство Windsor WCF вместо CreateChannel.Каков наилучший способ сделать это?

Я думал о создании фиктивной реализации ITrackingToolDAO, которая бы принимала параметр IKernel в конструкторе.

public class DummyDAO: ITrackingToolDAO {
    public DummyDAO(IKernel kernel) {
        _ProjectDAO = kernel.Resolve<IProject>();
        ....
    }
}

Таким образом, я мог бы использоватьWCF Facility для создания всех моих каналов.Мне просто не нравится, потому что он использует контейнер как сервисный локатор, который является запахом кода.В идеале мне также хотелось бы, чтобы я мог зарегистрировать свой DAO SQL и новый DAO WCF в контейнере, чтобы я мог создать любой из них, просто ссылаясь на них по имени.

Есть мысли?

1 Ответ

0 голосов
/ 08 июля 2011

Если вы используете Castle.Facilities.WcfIntegration, вы можете настроить свой дао следующим образом:

container.Register(Component.For<IProject>().ImplementedBy<Project>());

Вы можете использовать функцию WcfIntegration следующим образом:

container.AddFacility<WcfFacility>()
    .Register(Castle.MicroKernel.Registration.Component.For<IBusinessFunctionDAO>()
    .ImplementedBy<BusinessFunctionDAO>()
    .AsWcfService());

Чем для BusinessFunctionDAO вы можете сделать инжектор конструктора следующим образом:

public class BusinessFunctionDAO : IBusinessFunctionDAO 
{
   public BusinessFunctionDAO(IProject project)
   {
      if (project== null) new ArgumentException("project");
      _project = project;
   }
...


   private readonly IProject _project;
}
...