[英]Windsor WCF Facility factory?
因此,我目前拥有一个主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);
}
我目前有2个ITrackingToolDAO接口的具体实现。 第一个是TrackingToolSqlDAO ,它为每个实体实例化一个具体的SQL DAO。 即) BusinessFunctionSqlDAO , ProjectSqlDAO等。
第二个是TrackingToolWCFDao ,它使用ChannelFactory <T>创建WCF代理,以为我的所有DAO成员创建一个实现。
现在,我想开始使用Windsor WCF工具而不是CreateChannel。 做到这一点的最佳方法是什么?
我正在考虑创建ITrackingToolDAO的虚拟实现,该实现在构造函数中使用了IKernel参数。
public class DummyDAO: ITrackingToolDAO {
public DummyDAO(IKernel kernel) {
_ProjectDAO = kernel.Resolve<IProject>();
....
}
}
这样,我可以使用WCF工具创建所有频道。 我只是不喜欢它,因为它使用容器作为服务定位器,这是一种代码味道。 理想情况下,如果我可以将我的SQL DAO和新的WCF DAo都注册在容器中,那么我也很喜欢,因此我可以通过仅按名称引用来创建它们之一。
有什么想法吗 ?
如果您使用的是Castle.Facilities.WcfIntegration,则可以这样设置dao:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.