标签: unity-container

Unity [Dependency]属性无法解析

我有以下代码,当我尝试运行它时,我可以看到BrokerProvider没有被解析.这是我的代码:

static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            UnityConfigurationSection section = (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
            section.Containers.Default.Configure(container);

            new TestBroker().RunTestBroker();              
        }


class TestBroker
    {
        private IBrokerProvider brokerProvider;

        public void RunTestBroker()
        {
            List<IPortfolio> portfolios = BrokerProvider.GetPortfolios();
        }

        [Dependency]
        public IBrokerProvider BrokerProvider
        {
            get { return brokerProvider; }
            set { brokerProvider = value; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

相关配置

 <unity>
    <typeAliases>
      <typeAlias alias="string" type="System.String, mscorlib" />
      <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
      <typeAlias alias="IBrokerProvider" type="PA.Common.Interfaces.IBrokerProvider, PA.Common" />

      <typeAlias alias="PManager" type="PA.BrokerProviders.PManager, PA.BrokerProviders" />
    </typeAliases>
    <containers>
      <container>
        <types> …
Run Code Online (Sandbox Code Playgroud)

unity-container

1
推荐指数
1
解决办法
1万
查看次数

Unity ServiceLocator,在运行时注册类型

我有一个小工具包,它使用Unity DI和EntLib服务定位器.当第三方应用程序尝试使用EntLib服务定位器时,会出现此问题.看起来EntLib服务定位器是单例,因此当第三方应用程序引导其服务定位器时,它会清除我的服务定位器的配置.客户端以这种方式创建服务定位器:

        container = new UnityContainer();
        locator = new UnityServiceLocator(Initialize());
        ServiceLocator.SetLocatorProvider(() => locator);
Run Code Online (Sandbox Code Playgroud)

它以这种方式使用:

ServiceLocator.Current.GetInstance<IService>("MyService");
Run Code Online (Sandbox Code Playgroud)

有没有办法在运行时管理两个ServiceLocator或在服务定位器中注册其他组件?

unity-container service-locator

1
推荐指数
1
解决办法
6842
查看次数

IEventAggregator没有覆盖模块

我试图让我的IEventAggregator允许我在一个模块中发布和事件,并在另一个模块中捕获它.我在单个模块/项目中尝试了下面的代码,效果很好.它只在我有一个模块/项目发布事件而另一个订阅它时失败.

我已经通过统一将我的IEventAggregator注入到两个模块中.

我有3个项目,其中两个有模块(称为A和B),一个只是一个普通的类库(称之为接口)

在类库接口中有以下代码:

public class RandomTestEvent : CompositePresentationEvent<string>
{
}
Run Code Online (Sandbox Code Playgroud)

在模块A中,按钮单击命令中存在此代码(这实际上在项目中的视图模型中):

var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
evt2.Publish("Testing");
Run Code Online (Sandbox Code Playgroud)

在模块B中有以下代码:

    public void Initialize()
    {
        var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
        evt2.Subscribe(OnRandomThingDone);
    }

    private void OnRandomThingDone(string obj)
    {
        MessageBox.Show("Random Event Done With: " + obj);            
    }
Run Code Online (Sandbox Code Playgroud)

我可以追踪,我看到订阅被调用.当我看到Publish geting时调用者说Subscriptions = 1(因此它知道订阅已经完成,所以我似乎没有2个不同的IEventAggregator实例.)

但OnRandomThingDone永远不会在发布后调用.

任何想法为什么?(我需要发布更多代码吗?如果有,请告诉我.)

c# wpf prism unity-container eventaggregator

1
推荐指数
1
解决办法
972
查看次数

使用ASP.NET的棱镜

我的公司正在研究ASP.NET和Prism.我们想知道我们可以在两个选项之间获得多少代码重用.

正如我所看到的,Prism有这些"部分":

  • 壳牌(Bootstrapper等)
  • 模块
  • 服务(不是网络服务)
  • 地区
  • 松耦合事件(IEventAggregator)
  • Unity(虽然这是一个独立的产品)

在我看这个时,唯一必须与Silverlight/WPF一起使用的部分是Regions.

shell可能有点棘手,但我认为它可以在ASP.NET应用程序中完成.我也认为模块(非区域提供模块)也应该可行.使用IEventAggregator和Unity应该很容易.

我唯一的问题是我在ASP.NET编程方面并不是很有经验,所以我不确定我的假设.我会喜欢一些熟悉Prism和ASP.NET的人反馈,然后再讨论这个问题(在我的公司).

基本上,我想制作将运行Web服务和业务逻辑的Prism模块.然后,我想要使用这些模块并在ASP.NET应用程序和WPF/Silverlight Prism模块(通过区域)中重新使用它们.

我是否通过尝试合并这两个系统来绘制一段艰难的旅程?

asp.net prism unity-container

1
推荐指数
1
解决办法
2870
查看次数

Unity InjectionConstructor何时正常运行?

我有以下代码:

IOC.Container.RegisterType<IRepository, GenericRepository>
              ("Customers", new InjectionConstructor(new CustomerEntities()));
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如果在new CustomerEntities()类型注册发生时将调用一次,或者如果每次IRepository(名称为"Customers")被解析,将会产生新的CustomerEntities.

如果它不是后者,那么有没有办法让它更像是一个代表呢?(所以每次它解决它会创建一个新的?)

我找到了这段代码:

IOC.Container.RegisterType<IRepository, GenericRepository>("Customers")
             .Configure<InjectedMembers>()
             .ConfigureInjectionFor<ObjectContext>
              (new InjectionConstructor(new CustomerEntities()));
Run Code Online (Sandbox Code Playgroud)

我不确定是否会这样做,或者这只是我做第一个代码片段的旧方法.

任何建议都会很棒!

.net c# inversion-of-control unity-container

1
推荐指数
1
解决办法
1922
查看次数

Unity容器:注册两个单例,实现两个接口,其中一个是常见的

我无法弄清楚如何使用UnityContainer进行操作.

interface A { }
interface B { }
interface X { }
class ConcreteAX : A, X { }
class ConcreteBX : B, X { }
Run Code Online (Sandbox Code Playgroud)

我需要注册两个具体类,以便ServiceLocator.ResolveAll<X>返回两个实例.同一时间Resolve<A>,也Resolve<B>应该工作.而且,我必须在注册服务时自己实例化它们.

如果我使用命名注册X来创建ResolveAll工作,那么将创建每个具体类的两个实例.如果我用命名注册的所有接口,然后Resolve<A>Resolve<B>不起作用.如果我使用这种方法然后ResolveAll什么也不返回.

如何使用UnityContainer完成这个技巧?

.net c# unity-container service-locator resolve

1
推荐指数
1
解决办法
854
查看次数

使用Unity创建一个实例并在任何地方使用它

嗨我使用unity作为我的IoC框架,我有一个案例,我需要在整个应用程序中使用相同的对象实例,贝司风格创建一个单例.

假设我有这样的配置:

container.RegisterType<IValidationService, ValidationService>();
Run Code Online (Sandbox Code Playgroud)

我如何告诉团结只创建一个ValidationService实例并在我的应用程序中的任何地方使用它?

c# unity-container

1
推荐指数
1
解决办法
2163
查看次数

如何使用asp.net mvc和unity访问application_beginrequest上的统一容器?

使用asp.net mvc并通过nuget 安装unity bootstraper.

我想知道如何在bootstraper中配置的"Application_BeginRequest()","Application_Error()","Application_EndRequest()"中访问同一个统一容器?

以及如何在Application_BeginRequest中解析接口的所有实例?

c# asp.net-mvc inversion-of-control unity-container

1
推荐指数
1
解决办法
3453
查看次数

实现IAuthenticationFilter,工作单元和依赖注入

我有一个Web API 2项目正在实现自定义IAuthenticationFilter,如下所示.

我的问题是Unity没有在BasicAuthenticator类中注入UnitOfWork.正如预期的那样,Unity成功地在控制器中注入了UnitOfWork.

public class BasicAuthenticator : Attribute, IAuthenticationFilter
{
    [Dependency]
    public UnitOfWork UoW { get; set; }

    public bool AllowMultiple { get { return false; } }     

    public Task AuthenticateAsync(HttpAuthenticationContext context,
                                  CancellationToken cancellationToken)
    {
        // ignore missing implementation
        context.Principal = new ClaimsPrincipal(new[] { id });     
        return Task.FromResult(0);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
                            CancellationToken cancellationToken) {}
}
Run Code Online (Sandbox Code Playgroud)

c# entity-framework unity-container unit-of-work asp.net-web-api2

1
推荐指数
1
解决办法
876
查看次数

Ioc/DI - 如何使用已注册的依赖项?

我想我错过了如何实际使用IoC/DI的关键部分.我碰巧使用的是Unity容器.我知道如何设置一个类来注入它的依赖项,我也知道如何使Unity寄存器成为一种类型.

但我不知道的是如何实际使用这些注册.

例如:

var container = new UnityContainer();
container.RegisterType<IRepository, XmlRepository>();

var service = new MyService(container.Resolve<IRepository>());

public interface IRepository
{
    void GetStuff();
}

public class XmlRepository : IRepository
{
    public void GetStuff()
    {
        throw new NotImplementedException();
    }
}

public class MyService
{
    private readonly IRepository _myRepository;
    public MyService(IRepository repository)
    {
        _myRepository = repository;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我有一个服务层,它接受一个类型的参数IRepository.这是我似乎不理解的容器部分.

  • IoC/DI不是每次我需要创建实例时都不必手动解析类型的问题吗?在我的代码中我得到容器来解析一个类型,除非我误解了它应该如何工作,是不是容器应该以某种方式自动(用反射?)注入我告诉它使用的依赖我注册类型?var service = new MyService(...)正在调用container.Resolve这样做的正确方法吗?
  • 我已经创建了一个容器,但是如何在我的项目/代码中共享这个容器?这与第一个问题有关.我以前认为有一个地方可以注册类型.到目前为止,我能看到如何解决这个问题的唯一方法是:
    • 在我使用它们的地方继续注册类型,最后得到重复的代码
    • 将容器传递到我将要解决的每个地方
    • 这些方式都不是我希望这种方式发挥作用的方式

c# dependency-injection inversion-of-control unity-container

1
推荐指数
1
解决办法
938
查看次数