我有
Public Class AuthorBLL : IAuthorBLL
{
Public Add_Author();
Public Get_AuthorsList();
}
Public Class BookBLL : IBookBLL
{
Public Add_Book();
Public Get_BookList();
}
现在,我想在 WCF 层中调用业务逻辑层方法,并希望向 UI 公开类似的 WCF 操作协定方法。
我的 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。我怎样才能使它通用,以便将来我有出版商BLL,VentorBLL,CustomerBLL等......我不必在 WCF 构造函数中将它们全部传递?
我知道这是依赖注入的工作方式,但是如果我有 50 个 BLL 对象怎么办;我是否必须在 WCF 构造函数中将它们全部传递。有什么办法可以避免它吗?任何可以给我更好的解决方案的设计模式或技术。
我需要保留一个 WCF 服务,它可以公开所有方法,无论是其作者、书籍、出版商、客户、客户还是零售商。一个服务应公开所有 CRUD 方法。
编辑:正如您所说,将Ninjet或CastleWinsor用于IOC,您可以在其中创建容器来定义DI。但仍必须在 WCF 类的 WCF 构造函数中定义基于构造函数的参数。
我们是否必须定义构造函数参数,如下所示。 或者,如果 WCF 太大而无法公开这么多方法,那么对于您必须为作者、书籍、员工(在商店工作(、出版商、人力资源和工资单模块执行 CRUD 的应用程序的解决方案是什么? 每个模块都有网页,并调用 WCF 服务来执行 CRUD。 因为我们永远不知道什么时候需要转到移动界面或者有多少其他应用程序将使用相同的方法,因此我们希望通过 WCF 服务公开所有应用程序。我该怎么办?
private IAuthorBLL _authorBLL;
private IBookBLL _BookBLL;
private IClientBll _ClientBll;
private IPublisherBll _PublisherBll;
private IHRBll _HRBll;
private IEmployeeBll _employeeBll;
public WCFService(IAuthorBLL authorBll, IBookBLL bookBll, IClientBll clientBll, IPublisherBll publisherBll, IEmployeeBll 员工Bll,IHRBll HRBll( { _authorBLL = 作者Bll; _bookBll = 书Bll;
_authorBLL = 作者Bll; _ClientBll = 客户端Bll; _PublisherBLL = 出版商Bll; _HRBll = HrBll; _EmployeeBLL = 员工Bll;
}
因为我有很多前端页面来处理员工、作者、客户、书籍、出版商。我该怎么办。
你已经回答了自己。如果您使用一些DI
框架,如 Unity 或 Ninject,那么您就不必费心将50
参数传递给构造函数 - 只需从DI
框架的工厂检索服务对象,它将关心提供适当的参数。也许您缺少的是您可以在 DI 框架中注册您的服务及其依赖项。
Unity 的简单示例:
在某种初始化整个应用程序的引导程序类中:
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
在不同的模块之间拆分。它们中的每一个都注册自己的类。