0

我必须为客户生成账单,但根据他们居住的地方,账单包含几乎相同的数据,但它们的格式却大不相同。我想了几种方法来处理这个问题,例如:

public void GenerateBill(User user)
{
if(user.Location == "blah blah")
{
  //Code specific to this location
}
else if (user.Location == "dah dah")
{
  //Code specific to this location
}
}

上述方法似乎会变得很长,尤其是当不同位置的新用户不断出现时。我想过做类似的事情:

public void GenerateBillForUserInBlah();

public void GenerateBilForUserInDah();

但上述情况似乎也会失控,成为维护的噩梦。

我的另一个想法是使用一个接口,例如IGenerateBill,然后执行以下操作:

class UserInBlah : IGenerateBill
{
//Implement IGenerateBill members

}

但在上面,我必须为每个用户创建一个类。我可能仍然需要执行上述操作,但我认为如果这Managed Extension Framework在这里有用的话。有替代解决方案吗?主要问题是直到运行时我才知道用户的位置,所以我必须在运行时根据用户的位置调用正确的方法。

4

2 回答 2

2

当然,这种方法:

public interface IGenerateBill {}

是一个比其他的更优雅和可扩展的。是的,MEF 可以在这里为您提供帮助。
MEF 有一个“部分元数据”的概念。如果你不熟悉它,你可以在这里阅读它。

从概念上讲,MEF 元数据允许您编写IGenerateBill实现,例如包含国家代码或语言环境。稍后,在运行时,您可以通过以下方式检索正确的实现:

[BillGenerator("en-us")]
public class EnUsGenerateBill : IGenerateBill {}
[BillGenerator("ru-ru")]
public class RuRuGenerateBill : IGenerateBill {}
[BillGenerator("de-de")]
public class DeDeGenerateBill : IGenerateBill {}

container.GetExports<IGenerateBill, BillGeneratorMetadata>().Single(export => export.Metadata.Locale == "en-us");
于 2012-10-05T06:18:40.663 回答
0

您可以在每个类中都有一个属性来返回您的位置名称

例如:

        interface IGenerateBill
        {
            void GenerateBill();
            string SupportedCountry { get; }
        }

        class UserInUs : IGenerateBill
        {
        //Implement IGenerateBill members

            public void GenerateBill()
            {
                //generate bill
            }

            public string SupportedCountry
            {
                get { return "US"; }
            }
        }
        class UserInRussia : IGenerateBill
        {
        //Implement IGenerateBill members

            public void GenerateBill()
            {
                //generate bill
            }

            public string SupportedCountry
            {
                get { return "Russia"; }
            }
        }

客户端代码将是:

        string country = //Get from user in runtime
        var billGenerator = BillgeneratorFactory.ResolveAll().ToList().First
        (x => x.SupportedCountry == country);
        billGenerator.GenerateBill;
于 2012-10-05T06:39:25.933 回答