WCF和DI以及业务逻辑层,如何公开BLL的所有方法,最佳实践

时间:2013-09-25 12:33:46

标签: c# .net wcf dependency-injection

我有

Public Class AuthorBLL : IAuthorBLL
{
    Public Add_Author();
    Public Get_AuthorsList();
}

Public Class BookBLL : IBookBLL
{
    Public Add_Book();
    Public Get_BookList();
}

现在我想在我的WCF层中调用我的业务逻辑层方法,并希望向UI公开类似的WCF OperationContracts方法。

我的WCF类看起来像这样:

Public class WCFService : IWCFService
{
    private IAuthorBLL _authorBLL;
    private IBookBLL _BookBLL;


        public WCFService(IAuthorBLL authorBll, IBookBLL bookBll)
        {
            _authorBLL = authorBll;
         _bookBll = bookBll;    
        }   


    Public WCF_Add_Author (serializable_author author);
    {
        _authorBLL.Add_Author();
}

Public WCF_Get_AuthorsList()
{
    _authorBLL.Get_AuthorList();

}


Public WCF_Add_Book (serializable_book book);
    {
        _bookBll.Add_Book();
}

Public WCF_Get_BookList()
{
    _bookBll.Get_BookList();

}

}

问题:

我的问题是关于WCF构造函数,我必须将所有这些业务逻辑层对象作为构造函数参数传递以实现DI。我如何使它成为通用的,以便将来我有publisherBLL,VentorBLL,CustomerBLL等...我不必在WCF构造函数中传递它们全部?

我知道这是依赖注入的工作方式,但如果我有50个BLL对象呢?我将不得不在WCF构造函数中传递它们。有什么办法可以避免吗?任何可以为我提供更好解决方案的设计模式或技术。

我需要保留一个WCF服务,该服务可以公开所有方法,无论是作者,书籍,出版商,客户,客户还是零售商。一项服务应公开所有CRUD方法。


编辑: 正如您所说,在IOC中使用Ninjet或CastleWinsor,您可以在其中创建容器来定义DI。但是你仍然需要在WCF类的WCF构造函数中定义基于构造函数的参数。

我们是否必须定义构造函数参数,如下所示。或者如果WCF太大而无法公开这么多方法那么什么是应用程序的解决方案,你必须为作者,书籍,员工(在商店工作),出版商,人力资源和工资单模块做CRUD。每个模块都有网页并调用WCF服务来做CRUD。因为我们永远不知道什么时候需要转移到Mobile界面或者有多少其他应用程序将使用相同的方法,因此我们希望通过WCF服务公开所有内容。我该怎么办?

private IAuthorBLL _authorBLL;
    private IBookBLL _BookBLL;
    private IClientBll _ClientBll;
    private IPublisherBll _PublisherBll;
    private IHRBll _HRBll;
    private IEmployeeBll _employeeBll;

公共WCFService(IAuthorBLL authorBll,IBookBLL bookBll,IClientBll             clientBll,IPublisherBll publisherBll,IEmployeeBll             employeeBll,IHRBll HRBll)         {             _authorBLL = authorBll;          _bookBll = bookBll;
            _authorBLL = authorBll;          _ClientBll = clientBll;             _PublisherBLL = publisherBll;          _HRBll = HrBll;             _EmployeeBLL = EmployeeBll;

    }   

因为我有很多前端页面来处理员工,作者,客户,书籍,出版商。我该怎么办。

1 个答案:

答案 0 :(得分:1)

你几乎已经回答了自己。如果你使用UnityNinject这样的DI框架,那么你不必费心将50个参数传递给你的构造函数 - 只需从中检索服务对象DI框架的工厂,它将关心提供适当的论点。也许你缺少的是你可以在DI框架中注册你的服务以及它的依赖。

Unity的简单示例:

  

在某种初始化整个应用程序的Bootstrapper类中:

public void Run()
{
  //...
  SetupContainer();
  //...
  RunWebService();
  //...
}

public void SetupContainer()
{
  //This can also be done using a configuration file

  this.container.RegisterType<IAuthorBLL, AuthorBLLImpl>();
  this.container.RegisterType<IBookBLL, BookBLLImpl>();
  this.container.RegisterType<IOther1BLL, Other1BLLImpl>();
  //...
  this.container.RegisterType<IOther50BLL, Other50BLLImpl>();
}

public void RunWebService()
{
  this.container.RegisterType<IWCFService, WCFService>(
      new ContainerControlledLifetimeManager());

  var serviceSingleton = this.container.Resolve<IWCFService>();

  //... proceed with service setup and run
}

请注意,通常SetupContainer在不同模块之间分配。他们每个都注册自己的类。