gpt4 book ai didi

c# - 我可以使用属性让我的工厂知道它可以/应该在不违反 "Loosely-Coupled"规则的情况下实例化什么吗?

转载 作者:行者123 更新时间:2023-11-30 13:51:31 26 4
gpt4 key购买 nike

我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违背了这一点?

最佳答案

装饰工厂的产品类可以使开发更容易,这也是我有时做的事情。例如,当必须根据存储在数据库中的唯一标识符创建产品时,这尤其有用。该唯一 ID 和产品类别之间必须存在映射,并且使用属性可以使这一点变得非常清晰和可靠。除此之外,它还允许您添加产品类,而无需更改工厂。

例如,你可以这样装饰你的类:

[ProductAttribute(1)]
public class MyFirstProduct : IProduct
{
}

[ProductAttribute(2)]
public class MySecondProduct : IProduct
{
}

你可以像这样实现你的工厂:

public class ProductFactory : IProductFactory
{
private static Dictionary<int, Type> products =
new Dictionary<int, Type>();

static ProductFactory()
{
// Please note that this query is a bit simplistic. It doesn't
// handle error reporting.
var productsWithId =
from type in
Assembly.GetExecutingAssembly().GetTypes()
where typeof(IProduct).IsAssignableFrom(type)
where !type.IsAbstract && !type.IsInterface
let attributes = type.GetCustomAttributes(
typeof(ProductAttribute), false)
let attribute = attributes[0] as ProductAttribute
select new { type, attribute.Id };

products = productsWithId
.ToDictionary(p => p.Id, p => p.type);
}

public IProduct CreateInstanceById(int id)
{
Type productType = products[id];

return Activator.CreateInstance(productType) as IProduct;
}
}

完成此操作后,您可以使用该工厂来创建这样的产品:

private IProductFactory factory;

public void SellProducts(IEnumerable<int> productIds)
{
IEnumerable<IProduct> products =
from productId in productIds
select factory.CreateInstanceById(productId);

foreach (var product in products)
{
product.Sell();
}
}

例如,我过去曾使用这个概念来创建基于数据库标识符的发票计算。该数据库包含每种发票类型的计算列表。实际计算是在 C# 类中定义的。

关于c# - 我可以使用属性让我的工厂知道它可以/应该在不违反 "Loosely-Coupled"规则的情况下实例化什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com