我正在努力解决使ServiceLocator成为反模式的问题。
有人说,传递容器会使其成为反模式,其他人则担心应用程序增长后的可维护性(隐藏的依赖关系)。 以下示例演示了使用AutoFac进行的简单注册,包括依赖项:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AutoFacSample
{
using System.Reflection;
using Autofac;
class Program
{
static void Main(string[] args)
{
var assembly = Assembly.GetExecutingAssembly();
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.Contains("First")).AsImplementedInterfaces();
Holder.Container = builder.Build();
var first = Holder.Container.Resolve<IFirst>();
}
}
public static class Holder
{
public static IContainer Container { get; set; }
}
public interface IFirst {}
public interface ISecond {}
public interface IThird {}
public class First : IFirst
{
public First(ISecond second)
{
}
}
public class Second : ISecond
{
public void Foo()
{
var third = Holder.Container.Resolve<IThird>();
}
}
public class Third : IThird {}
}
您会将我的样本视为反模式吗?如果是这样,有什么好的选择吗?
修改
我知道问题Is ServiceLocator an anti-pattern?,但答案并不能解释我的样本是不是反模式的天气。
谢谢,
特里尼