[英]Autofac Registration & Resolution Confusion
无法确定如何注册具有不同参数 arguments 的具体 class 的两个实例,这些参数稍后需要解析为不同的服务。 在我的应用程序中,我将数据从 model 输出到文本文件:
var builder = new ContainerBuilder();
builder.RegisterType<SqlConnection>()
.WithParameter("connectionString", ConnectionString)
.As<IDbConnection>();
builder.Register(c => new FileStream(".\cat.txt", FileMode.Create, FileAccess.ReadWrite))
.As<FileStream>();
// how would I also register another file stream like this so that it can be used later on?
//builder.Register(c => new FileStream(".\dog.txt", FileMode.Create, FileAccess.ReadWrite))
// .As<FileStream>();
// and would I need to alter this, or would it be able to resolve multiple streamwriters?
builder.Register(c => new StreamWriter(c.Resolve<FileStream>()) { AutoFlush = true })
.As<StreamWriter>();
builder.Register(c =>
{
var csvWriter = new CsvWriter(c.Resolve<StreamWriter>(), CultureInfo.InvariantCulture);
});
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var cnn = container.Resolve<IDbConnection>();
var catRecords = cnn.Query<CatModel>("select * from dbo.Cat")
container.Resolve<CsvWriter>().WriteRecords(catRecords);
// how do I get the correct resolution here?
//var dogRecords = cnn.Query<DogModel>("select * from dbo.Dog")
//container.Resolve<CsvWriter>().WriteRecords(dogRecords);
}
如何正确注册和解析以正确合并这两个文件? 我需要使用委托工厂吗? 键控注册? 我已经阅读了很多文档,但我无法弄清楚这里适合什么。
使用键控服务实现
var builder = new ContainerBuilder();
builder.RegisterType<SqlConnection>()
.WithParameter("connectionString", ConnectionString)
.As<IDbConnection>();
builder.Register(c => new FileStream(".\cat.txt", FileMode.Create, FileAccess.ReadWrite))
.Keyed<FileStream>("cat");
builder.Register(c => new FileStream(".\dog.txt", FileMode.Create, FileAccess.ReadWrite))
.Keyed<FileStream>("dog");
builder.Register(c => new StreamWriter(c.ResolveKeyed<FileStream>("cat")) { AutoFlush = true })
.Keyed<StreamWriter>("cat");
builder.Register(c => new StreamWriter(c.ResolveKeyed<FileStream>("dog")) { AutoFlush = true })
.Keyed<StreamWriter>("dog");
builder.Register(c =>
{
new CsvWriter(c.ResolveKeyed<StreamWriter>("cat"), CultureInfo.InvariantCulture);
}).Keyed<CsvWriter>("cat");
builder.Register(c =>
{
new CsvWriter(c.ResolveKeyed<StreamWriter>("dog"), CultureInfo.InvariantCulture);
}).Keyed<CsvWriter>("dog");
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var cnn = container.Resolve<IDbConnection>();
var catRecords = cnn.Query<CatModel>("select * from dbo.Cat")
container.ResolveKeyed<CsvWriter>("cat").WriteRecords(catRecords);
var dogRecords = cnn.Query<DogModel>("select * from dbo.Dog")
container.ResolveKeyed<CsvWriter>("dog").WriteRecords(dogRecords);
}
将上述解决方案与Autofac 模块相结合,以帮助遵守 DRY 编码实践。 为命名服务交换键控服务,因为这更多是意图。 附带说明一下,CsvWriter(CsvHelper 的一部分)在使用WriteRecords
时会自动刷新缓冲区。 通过在 StreamWriter 上设置AutoFlush = false
,您将获得更好的性能。
public class FlatFileModule : Module
{
protected readonly string _filePath;
protected readonly string _recordType;
public FlatFileModule(string FilePath, string RecordType)
{
_filePath = FilePath;
_recordType = RecordType;
}
protected override void Load(ContainerBuilder builder)
{
builder.Register(c =>
new StreamWriter(_filePath, false, Encoding.UTF8)
{
AutoFlush = false
})
.Named<StreamWriter>(_recordType);
builder.Register(c =>
new CsvWriter(
c.ResolveNamed<StreamWriter>(_dataType),
CultureInfo.InvariantCulture)
)
.Named<IWriter>(_recordType);
}
}
...
var builder = new ContainerBuilder();
builder.RegisterType<SqlConnection>()
.WithParameter("connectionString", ConnectionString)
.As<IDbConnection>();
builder.RegisterModule(new FlatFileModule(@".\cat.txt", "Cat"));
builder.RegisterModule(new FlatFileModule(@".\dog.txt", "Dog"));
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var cnn = container.Resolve<IDbConnection>();
var catRecords = cnn.Query<CatModel>("select * from dbo.Cat")
container.ResolveNamed<IWriter>("Cat").WriteRecords(catRecords);
var dogRecords = cnn.Query<DogModel>("select * from dbo.Dog")
container.ResolveNamed<IWriter>("Dog").WriteRecords(dogRecords);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.