我有一个有两个ctors的课.一个无参数和一个带参数.
Unity将默认采用gready方法并转到最后一个ctor.
如何定义要使用的ctor(我想参数化)而不在我的类中添加对Unity的依赖?我认为可以在我的容器创建中做到这一点,但我不知道如何.
目前我的注册条目如下所示:
container.RegisterType<IConfigurationService, SqlConfigurationService>()
Run Code Online (Sandbox Code Playgroud)
更新
我试图尽可能避免在XML(配置文件)中编程.
EXTRA
如何使用一个参数注册一个构造函数(它应该被注入)?
说ILoggerService已经注册,我想使用构造函数
public SqlConfigurationService(ILoggerService logger){}
Run Code Online (Sandbox Code Playgroud) 我正试图像这样向我的MVC控制器注入一个依赖项
private static void RegisterContainer(IUnityContainer container)
{
container
.RegisterType<IUserService, UserService>()
.RegisterType<IFacebookService, FacebookService>();
}
Run Code Online (Sandbox Code Playgroud)
UserService类有一个像这样的构造函数...
public UserService(): this(new UserRepository(), new FacebookService())
{
//this a parameterless constructor... why doesnt it get picked up by unity?
}
public UserService(IUserRepository repository, IFacebookService facebook_service)
{
Repository=repository;
this.FacebookService=facebook_service;
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是以下......
当前类型Repositories.IUserRepository是一个接口,无法构造.你错过了类型映射吗?
看起来它正在尝试将一个构造函数注入到服务中,但是默认就足够了吗?为什么它不映射到无参数构造函数?
我是IoC的新手,我正在玩Unity.假设你有'n'项目的解决方案,你想使用Unity来注册和解决依赖关系.比方说,你的作文根是在项目一个.假设您在解决方案中有以下项目.
A B C D
让我们说a取决于b中的某些东西,b取决于c和c中的某些东西取决于d中的某些东西
我已经看到你如何使用构造函数注入来解决a => b依赖关系但我仍然坚持如何解决b对c 的依赖性而无需访问在项目a中配置和创建的容器.
解决嵌套依赖项的方法是什么?是否存在解决深度依赖关系的讨论/博客/示例?
我正在寻找Unity的一些基本示例/解释.我很难掌握这个概念.我对注入模式有基本的了解,因为Unity似乎与它紧密相关.我感谢任何帮助.
design-patterns dependency-injection inversion-of-control unity-container
我在trynig加载视图时遇到上述异常.
我正在使用Unity来初始化我的控制器实例.仍然得到上述错误.
这是我的控制器.
public class SiteController : Controller
{
private ISiteRepository _repository;
public SiteController(ISiteRepository repository)
{
_repository = repository;
}
//
// GET: /Site/
public ActionResult Index()
{
return View();
}
//
// GET: /Site/Details/5
public ActionResult Details(int id)
{
return View();
}}
Run Code Online (Sandbox Code Playgroud)
这是我的Global.asax.cs
protected void Application_Start()
{
ConfigApi(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
static void ConfigApi(HttpConfiguration config)
{
var unity = new UnityContainer();
unity.RegisterType<SiteController>();
unity.RegisterType<ISiteRepository, SiteRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new IocContainer(unity);
}
Run Code Online (Sandbox Code Playgroud)
这是我的SiteRepository类.
public class SiteRepository:ISiteRepository
{
private readonly …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Entity Framework实现存储库解决方案,但是我在使用Unity注册包含泛型的类型时遇到了问题.
鉴于:
// IRepository interface
public interface IRepository<TEntity>
{
// omitted for brevity
}
// Repository implementation
public class Repository<TEntity, TContext> : IRepository<TEntity>, IDisposable
where TEntity : class
where TContext : DbContext
{
// omitted for brevity
}
// service layer constructor
public MyServiceConstructor(IRepository<Account> repository)
{
_repository = repository;
}
Run Code Online (Sandbox Code Playgroud)
我需要将IRepository的类型映射注册到Repository.但是我在使用这种映射的Unity语法时遇到了麻烦.
我试过以下没有运气:
container.RegisterType<IRepository<>, typeof(Repository<,>)>();
container.RegisterType<typeof(IRepository<>), Repository<,>>();
Run Code Online (Sandbox Code Playgroud)
编辑
基于@Steven响应我现在有以下实现:
// UnityRepository implementation
public class UnityRepository<TEntity> : Repository<TEntity, MyDbContextEntities>
where TEntity : class
{
public UnityRepository() : …Run Code Online (Sandbox Code Playgroud) entity-framework unity-container separation-of-concerns repository-pattern
我正在Unity IoC中实现动态加载和注册我的程序集.
鉴于这些类:
public interface IA { }
public interface IB { }
public interface IC { }
public class A : IA { }
public class B : IB
{
public B(IA a) { }
}
public class C : IC
{
public C(IB b) { }
}
Run Code Online (Sandbox Code Playgroud)
而这个配置:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
AllClasses.FromAssemblies(assembly),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)
代码:
var c = container.Resolve(typeof(IC));
Run Code Online (Sandbox Code Playgroud)
抛出:
Microsoft.Practices.Unity.dll中出现"Microsoft.Practices.Unity.ResolutionFailedException"类型的第一次机会异常
附加信息:依赖项的解析失败,type ="MyAsm.IC",name ="(none)".
在解决时发生异常:
例外情况是:InvalidOperationException - 类型IC没有可访问的构造函数.
在例外时,容器是:
MyAsm.IC,(无)
所有上述代码都在同一个程序集MyAsm中执行.在调试中分析容器,该Registrations属性列出了似乎正确的映射集合A, …
我正在实施Ioc,我想确保一些正确的事情.
RegisterInstance,在解析它时将始终返回单例对象?但我想知道如何
1.每个解析创建一个单独的实例,PerResolve不能使用RegisterInstance,它只适用于RegisterType.
2.如果我将依赖对象作为静态属性,它将以相同的方式工作,如果我能够为每个解析创建单独的实例?
请帮忙?
public class ClientUser : UserServiceBase, IClientUser
{
private IDataServiceManager _dataServiceManager;
public ClientUser()
{
}
private IDataServiceManager DataServiceMgr
{
get
{
if (_dataServiceManager == null)
_dataServiceManager = ProjectContainer.Instance.Resolve<IDataServiceManager>();
return _dataServiceManager;
}
}
Run Code Online (Sandbox Code Playgroud) 我似乎在这里遇到了障碍,并希望得到任何能够在这一方面得到帮助的人.我不确定下面的错误消息是什么意思.我正在使用企业模式服务的缓存块,但我继续遇到下面的问题.我下载了最新版本,并尝试逐步解决这个问题,但我似乎无法解决确切的问题,我需要帮助.提前致谢
Test method WorldBank.Service.Business.UnitTest.TopicsManagerTest.Call_Children_out_of_schoolTest threw exception:
Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type ICacheManager, key "Cache Manager" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager", name = "Cache Manager".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was:
Resolving Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager,WuCache
---> System.InvalidOperationException: The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is …Run Code Online (Sandbox Code Playgroud) 目前,我有一个自定义ControllerFactory,我注入我的Unity容器:
在global.asax Application_Start()中:
var container = InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);
Run Code Online (Sandbox Code Playgroud)
在控制器工厂中,我将控制器设置为使用自定义ActionInvoker,如下所示:
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var controller = base.GetControllerInstance(requestContext, controllerType) as Controller;
if (controller != null)
controller.ActionInvoker = new UnityActionInvoker(_container);
return controller;
}
Run Code Online (Sandbox Code Playgroud)
最后在我的自定义ActionInvoker中,我尝试使用ActionInvokers容器构建调用的操作:
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
var builtUpFilters = new List<IActionFilter>();
foreach (IActionFilter actionFilter in filters)
{
builtUpFilters.Add(_container.BuildUp<IActionFilter>(actionFilter));
}
return base.InvokeActionMethodWithFilters(controllerContext, builtUpFilters, actionDescriptor, parameters);
}
Run Code Online (Sandbox Code Playgroud)
以下是正在构建的ActionFilters之一的示例:
public class PopulatRolesAttribute …Run Code Online (Sandbox Code Playgroud)