我有3个抽象类(Customer,Tender,Site)。对于Customer,继承了CorporateCustomer等类。对于Tender有PreTender,InTender,PostTender的具体课程。网站有CorporateSite类。
我已经很好地布局了我们的方法,属性,这些对象和测试之间的关系很好。
在MyTestApp实施中:
Customer customer = new CorporateCustomer(35); // ==> This will pass CustomerID = 35
string customerTenderName = customer.InTenders[0].Name; // ==> Customer has many Tender
Customer customer = new CorporateCustomer(35); // ==> This will pass CustomerID = 35
string customerSiteName = customer.CorporateSites[0].Name; // ==> Customer has many Site
在我的网站中也实现了Get():
Site site = new CorporateSite();
List<Site> = site.Get(); // ==> This will return all sites
现在问题是我想要使用相同的Get()
执行以下操作Customer customer = new CorporateCustomer(35);
List<Site> = customer.CorporateSite.Get(); // ==> This will return all site belong to Customer (at this stage I don't know how to do this as yet)
正如你所看到的那样,因为它使用相同的Get()方法,所以不使用像这个GetByCustomer()那样区分它。
有没有办法以某种方式你在Get()我有一个“检查”哪个是相关的需要显示基于对象/类实例化或什么。
谢谢
答案 0 :(得分:1)
如何customer.CorporateSites
返回客户的所有网站?
答案 1 :(得分:1)
您应该可以使用可以注入到CorporateSite类(和其他类)中的策略来执行此操作。然后,CorporateSite类使用策略来实现Get方法。
在此示例中,我使用Func<IList<Site>>
作为策略(since delegates are excellent anonymous interfaces),但如果您更愿意,可以使用接口或抽象类。
想象一下,您修改了CorporateSite类以将策略作为输入:
public class CorporateSite
{
private readonly Func<IList<Site>> get;
public CorporateSite(Func<IList<Site>> getStrategy)
{
this.get = getStrategy;
}
public IList<Site> Get()
{
return this.get();
}
}
如果你有一个很好的默认实现,你可以添加一个使用默认策略的构造函数重载,但我将其留作读者的练习。
这里的要点是,CorporateSite类本身不实现Get方法,而是将该实现推迟到策略。
然后,Customer类可以将所需的策略注入它公开的CorporateSite实例中:
public class Customer
{
private readonly CorporateSite site;
public Customer()
{
this.site = new CorporateSite(this.GetSites);
}
public CorporateSite CorporateSite
{
get { return this.site; }
}
private IList<Site> GetSites()
{
// Put real implementation here
return new List<Site>();
}
}
需要公开CorporateSite的其他类可以在应用自己的Get逻辑时执行相同操作。
您可以使用相同的模式来实现需要使用Get方法的其他类。