我有一个带有工厂服务的应用程序,可以在解决必要的依赖项注入的同时构建实例。例如,我用它来构建对话框视图模型。我有一个如下所示的服务接口:
public interface IAsyncFactory
{
Task<T> Build<T>() where T: class, IAsyncInitialize;
}
理想情况下,我想要的是这样的(伪语法,因为这不能直接实现)
public interface IFactory
{
Task<T> Build<T>() where T: class, IAsyncInitialize;
T Build<T>() where T: class, !IAsyncInitialize;
}
这里的想法是,如果一个类支持IAsyncInitialize
,我希望编译器解析返回的方法Task<T>
因此从使用代码可以明显看出它需要等待初始化。如果类不支持IAsyncInitialize
,我想直接退课。 C# 语法不允许这样做,但是有没有不同的方法来实现我所追求的目标?这里的主要目标是帮助提醒类的使用者实例化它的正确方法,以便对于具有异步初始化组件的类,我不会在初始化之前尝试使用它。
我能想到的最接近的是创建单独的Build
and BuildAsync
方法,如果您调用 Build ,则会出现运行时错误IAsyncInitialize
类型,但这没有在编译时捕获错误的好处。
一般来说,微软建议添加async
命名异步方法时的后缀。因此,您假设创建两个名为的方法Build
and BuildAsync
说得通。
我认为没有办法强制执行诸如“所有未实现的类型IAsyncInitialize
应使用Build
方法而不是BuildAsync
“除非你强迫开发人员使用另一个接口来标记同步方法,例如ISynchronousInitialize
.
您可以尝试以下方法;
-
不必分离方法,只需实现一个BuildAsync
具有以下签名的方法:
Task<T> BuildAsync<T>() where T: class
In the BuildAsync
方法检查是否T
实施IAsyncInitialize
。如果是这种情况,只需在创建类型的对象后调用相关的初始化代码即可T
。否则,只需创建一个TaskCompletionSource
对象并像异步一样运行同步初始化代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)