gpt4 book ai didi

c# - 如何从 Unity 获取接口(interface)实例?

转载 作者:行者123 更新时间:2023-11-30 22:04:09 26 4
gpt4 key购买 nike

我注册了

container.RegisterType<IService, MyService>();

我想创建一个类似于

的辅助类
public class MyHelper
{
private IService _service;

public void SomeMethod
{
_service.RunSomething();
}
}

我真的希望这个 _serivce 神奇地映射到 MyService 构造函数而不是 null,因为我无法在其他任何地方找到 IService 或 Service 实例。

如何根据 Unity 映射使这个 _service 自映射?

最佳答案

您仍然必须分配注入(inject)的 IService到你的实例。这通常是通过构造函数完成的:

public class MyHelper {
private readonly IService _service;

public MyHelper(IService service) {
_service = service;
}

public void SomeMethod() {
// _service isn't null anymore
}
}

编辑:查看您的评论,我认为您没有正确使用 IoC,因此我将尝试填补一些空白。您不想创建 MyHelper 的新实例因为无论创造什么,它都必须了解 IService和任何其他依赖项 MyHelper介绍。相反,您可以创建一个工厂来处理创建 MyHelper 的新实例。这也将处理它的依赖关系。这样,您可以设置 IoC 来解决对该工厂的依赖。

public interface IInstanceFactory<out T> {
T Create();
}

public class MyHelperFactory : IInstanceFactory<MyHelper> {
private readonly Func<MyHelper> _myHelperFactory;

public MyHelperFactory(Func<MyHelper> myHelperFactory) {
_myHelperFactory = myHelperFactory;
}

public MyHelper Create() {
return _myHelperFactory();
}
}

所以我们现在有一个存储 Func 的工厂用于创建 MyHelper 的实例.它所做的只是执行我们将在 IoC 设置中定义的函数。该函数所做的只是返回 MyHelper 的一个新实例。 .

现在我们可以设置 IoC 来为我们处理其他所有事情。因此,在您的 IoC 设置中,您将执行以下操作(我不了解 Unity,所以我将向您展示如何使用 Autofac。Unity 应该能够完成我所展示的一切。)

注册服务:

container.RegisterType<MyService>().As<IService>();

注册工厂:(这是神奇的地方)

container.Resolve(b => {
var service = b.Resolve<IService>();
var myHelperFactory = new Func<MyHelper>(() => new MyHelper(service));

return new MyHelperFactory(myHelperFactory);
}).As<IInstanceFactory<MyHelper>>();

这里我们得到一个 IService 的实例我们已经注册为MyService .然后我们创建一个 Func<MyHelper>谁刚刚创建了 MyHelper 的新实例并传递 IService例如我们刚刚解决。最后,我们返回一个新的 MyHelperFactory并通过 Func<MyHelper>进厂。

假设我们有类 Foo .和 Foo需要创建 MyHelper 的实例在不知道MyHelper's的情况下依赖项:

public class Foo {
private readonly IMyHelperFactory _factory;

public Foo(IMyHelperFactory factory) {
_factory = factory;
}

public void MethodThatCreatesMyHelper() {
var instance = _factory.Create();
// you now have a valid instance of `MyHelper`
}
}

你要做的最后一件事是解析 Foo从你的容器(只要你设置它):

var fooInstance = container.Resolve<Foo>();

fooInstance.MethodThatCreatesMyHelper();

这是一个 gist我上面的例子。要点是Foo可以创建一个实例 MyHelper在不知道其依赖关系的情况下。

关于c# - 如何从 Unity 获取接口(interface)实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25415231/

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