gpt4 book ai didi

c# - 使用Autofac切换一个抽象工厂的具体实现

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:38 26 4
gpt4 key购买 nike

我正在为一个与 AutoFac 和抽象工厂模式相关的问题感到羞愧。我的示例是一项服务,它使用 IRepositoryFactory 创建基于 JSON 或与用户输入相关的 InMemory 的存储库。

// Abstract Factory
public interface IRepositoryFactory{
IRepository Create(string databaseIdentifier);
}

// JSON
public class JsonRepositoryFactory{
public IRepository Create(string databaseIdentifier){
return new JsonRepository(databaseIdentifier);
}
}

// InMemory
public class MemoryRepository{
public IRepository Create(string databaseIdentifier){
return new MemoryRepository(databaseIdentifier);
}
}

服务应该通过构造函数注入(inject)来拉动工厂。

public interface IShopService{
public string Name {get;}
}

public class BeerShop : IShopService {
public string Name {get; private set;}
private readonly IRepository _repository;

public BeerShop(IRepositoryFactory repositoryFactory){
Name = "beershop";
_repository = repositoryFactory.Create(Name);
}
}

到目前为止,我对此很满意。但是初始化不是我最喜欢的。

var builder = new ContainerBuilder();
var userInput = ReadInput();

if(userInput = "json")
builder.RegisterType<IRepositoryFactory>().As<JsonRepositoryFactory>();
else
builder.RegisterType<IRepositoryFactory>().As<MemoryRepositoryFactory>();

builder.RegisterType<IShopService>.As<BeerShop>();

var container = builder.build();

[...]

var service = container.Resolve<IShoptService>();
// and so on ...

这是解决问题的正确方法吗?我不相信我自己的设计,因为它在容器初始化之前强制用户输入。如果用户必须在运行时更改存储库怎么办?抽象工厂模式是解决这个问题的正确工具吗?

最佳答案

由于在配置容器时知道存储库的类型,因此您应该直接注册特定的存储库。工厂就不用介绍了,有hardly ever is a reason引入工厂抽象。

例子:

var builder = new ContainerBuilder();
var userInput = ReadInput();

if(userInput = "json")
builder.Register<IRepository>(c => new JsonRepository("dbidentifier"));
else
builder.Register<IRepository>(c => new MemoryRepository());

builder.RegisterType<BeerShop>.As<IShopService>();

var container = builder.build();

[...]

var service = container.Resolve<IShopService>();

此代码允许简化 BeerShop,因为 its constructor would be simple现在它只依赖于 IRepository 而不是 IRepositoryFactoryIRepository。这简化了测试并更容易推理此类。此外,它删除了不需要的抽象。

关于c# - 使用Autofac切换一个抽象工厂的具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40298802/

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