我想使用 Autofac 为给定工作单元创建一个或多个 WCF 通道的新实例。我想使用命令模式来表示工作单元,即给定的命令类注入它需要的通道并实现一系列相关操作。
我尝试了以下方法:
interface IUnitOfWork
{
}
class FooCall : IUnitOfWork
{
readonly BarChannel _channel;
public FooCall(BarChannel channel)
{
Console.WriteLine($"FooCall({new {channel}})");
_channel = channel;
}
public string Foo()
{
return "FOO";
}
}
class BarChannel
{
public BarChannel()
{
Console.WriteLine("BarChannel()");
}
}
class FooService
{
Func<Owned<FooCall>> _helperFn;
public FooService(Func<Owned<FooCall>> helperFn)
{
_helperFn = helperFn;
}
public void CallFoo()
{
using (var helper = _helperFn())
{
Console.WriteLine($"CallFoo(), helper={helper}");
helper.Value.Foo();
}
}
}
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<BarChannel>().InstancePerOwned<IUnitOfWork>();
builder.RegisterType<FooCall>().AsImplementedInterfaces().AsSelf();
builder.RegisterType<FooService>();
using (var scope = builder.Build().BeginLifetimeScope())
{
Console.WriteLine("call 1");
scope.Resolve<FooService>().CallFoo();
Console.WriteLine("call 2");
scope.Resolve<FooService>().CallFoo();
}
}
}
简而言之:服务方法创建一个拥有的工作单元;工作单元被注入了它调用的每个拥有的通道。代码示例应显示正在创建的两个通道实例。
除了似乎为拥有的依赖项创建的生命周期范围仅标记为解析依赖项的类型 - 即 as FooCall,而不是 as IUnitOfWork。如果我注册BarChannel为InstancePerOwned<FooCall>,则代码有效;按原样注册为InstancePerOwned<IUnitOfWork>,它无法解析FooService,因为它找不到匹配的生命周期范围。我是否遗漏了某些东西,或者是我想要使用 Autofac 无法实现的功能?我宁愿不必将所有 WCF 通道注册为每个命令类的每个拥有的实例,这似乎会变得非常冗长。另一种解决方法是使用每个依赖实例并直接解析 Func,但这不会让我说在重用通道及其之间的依赖关系的同时组成工作单元。
慕工程0101907
相关分类