我正在尝试在我的项目中使用autofac。所以在Mef中,我可以使用此代码获取接口的实例:
private static CompositionContainer _container;
public static void Initialize()
{
string path = AppDomain.CurrentDomain.BaseDirectory.Contains(@"\bin") ?
AppDomain.CurrentDomain.BaseDirectory :
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin");
//DirectoryCatalog catalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.Data*.dll");
DirectoryCatalog catalog = new DirectoryCatalog(path, "*.dll");
_container = new CompositionContainer(catalog);
_container.ComposeParts();
}
private static void CheckContainer()
{
if (_container == null)
{
Initialize();
}
}
public static T GetInstance<T>()
{
CheckContainer();
return _container.GetExportedValue<T>();
}
但autofac似乎让我感到困惑......如何使用autofac将此功能添加到我的应用中?
由于
我将该代码更改为:
private static ContainerBuilder _container;
private static IContainer container;
public static void Initialize()
{
_container = new ContainerBuilder();
var logging = Assembly.Load("StarlightFramework.Logging");
_container.RegisterAssemblyTypes(logging);
container = _container.Build();
}
public static T GetInstance<T>()
{
if(container == null)
Initialize();
return container.Resolve<T>();
}
但这次我得到了这个错误:“无法加载文件或程序集'Autofac,Version = 2.6.1.841,Culture = neutral,PublicKeyToken = 17863af14b0044da'或其中一个依赖项。”
可能是什么问题?
答案 0 :(得分:9)
首先,您必须构建容器并注册您的服务。
var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>();
var container = builder.Build();
然后,您可以使用Resolve
扩展方法获取已注册服务的实例。
var service = container.Resolve<IMyService>();
答案 1 :(得分:1)
确保应用程序的bin文件夹中存在Autofac.dll程序集,并且程序集与StarlightFramework.Logging使用的版本具有相同的版本。