gpt4 book ai didi

c# - 使用 Func 和依赖注入(inject)的 Autofac 动态调用

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:50 25 4
gpt4 key购买 nike

假设我有一个类如下

public class Foo
{
public Foo(string someTitle, IFooService fooService)
{
// do stuff
}
}

我知道我可以使用 DI 和 autofac 像这样实例化它

public class Bar
{
public Bar(Func < string, IFooService, Foo > foo, IFooService fooService)
{
var foo = foo("some string", fooService);
}
}

但我想知道是否有任何方法可以让 Bar 不必知道有关 IFooService 的任何信息?我不想为了满足功能而将 IFooService 注入(inject) Bar。

本质上是这样的

// pseudo code - don't use
public class Bar
{
public Bar(Func < string, Foo > foo)
{
var foo = foo("some string");
}
}

我真正想在我的应用程序中做的是删除服务位置的所有实例,并完全依赖依赖注入(inject)。

最佳答案

Autofac 应该能够通过使用 the Func<T> implicit relationship 完全按照您的意愿进行操作.

这是一个小的复制品,展示了如何省略 IFooService Func<T> 中的参数并且只要 Autofac 可以解决其他依赖项,您就可以开始了。

做一些疯狂工作的样本类型......

public class Bar
{
private Foo _foo;

// This constructor looks like what you're aiming for...
public Bar(Func<string, Foo> factory)
{
this._foo = factory("title");
}

public void ShowMeCoolStuff()
{
this._foo.DoWork();
}
}

public class Foo
{
private string _title;
private IFooService _service;

// The Foo class takes the title AND an IFooService...
public Foo(string title, IFooService service)
{
this._title = title;
this._service = service;
}

public void DoWork()
{
Console.WriteLine("Foo title = {0}", this._title);
this._service.DoMoreWork();
}
}

public interface IFooService
{
void DoMoreWork();
}

public class FooService : IFooService
{
public void DoMoreWork()
{
Console.WriteLine("FooService doing more work.");
}
}

注册时,确保所有依赖项都已注册 - Foo , Bar , 一些实现 IFooService :

var builder = new ContainerBuilder();
builder.RegisterType<Foo>();
builder.RegisterType<Bar>();
builder.RegisterType<FooService>().As<IFooService>();
var container = builder.Build();

当你下定决心时,一切都会顺势而为。这个决议...

var bar = container.Resolve<Bar>();
bar.ShowMeCoolStuff();

...将产生以下控制台输出:

Foo title = title
FooService doing more work.

There is fairly robust documentation with examples over on the Autofac site.

关于c# - 使用 Func 和依赖注入(inject)的 Autofac 动态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24876264/

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