标签: unity-container

Castle Windsor到Unity - 您可以在CW中以与CW相同的方式自动配置吗?

我不知道这是不是一个特定的问题,如果可能的话,但是我不得不移植一个使用Castle Windsor到Unity的应用程序,这样就不会依赖非Microsoft认可的库了.我知道我知道但是你打算做什么.

无论如何我已经设法了,但我对我所拥有的东西不满意.在温莎我有这个:

Register(
            AllTypes.Of(typeof(AbstractPresenter<>)).FromAssemblyNamed("Links.Mvp"),
            AllTypes.Of(typeof(IView)).FromAssemblyNamed("Links.WinForms").WithService.FromInterface());
Run Code Online (Sandbox Code Playgroud)

我已经团结一致地转变为这个

RegisterType<IMainView, MainView>();
        RegisterType<IConfigureLinkView, ConfigureLinkView>();
        RegisterType<IConfigureSourceView, ConfigureSourceView>();
        RegisterType<IConfigureSinkView, ConfigureSinkView>();
        RegisterType<MainPresenter, MainPresenter>();
        RegisterType<ConfigureLinkPresenter, ConfigureLinkPresenter>();
        RegisterType<ConfigureSourcePresenter, ConfigureSourcePresenter>();
        RegisterType<ConfigureSinkPresenter, ConfigureSinkPresenter>();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我必须注册每一件事,而不是能够使用某种自动配置.所以我的问题是:在团结中有更好的方法吗?

谢谢,

亚当.

c# dependency-injection castle-windsor unity-container

6
推荐指数
2
解决办法
3058
查看次数

使用Unity在多个类型中注入相同的DataContext实例

假设我有IRepository接口及其实现SqlRepository,它将LINQ作为参数作为SQL DataContext的参数.假设我有IService接口及其实现服务,它需要三个IRepository,IRepository和IRepository.演示代码如下:

public interface IRepository<T> { }

public class SqlRepository<T> : IRepository<T>
{
    public SqlRepository(DataContext dc) { ... }
}

public interface IService<T> { }

public class Service<T,T1,T2,T3> : IService<T>
{
    public Service(IRepository<T1> r1, IRepository<T2>, IRepository<T3>) { ... }
}
Run Code Online (Sandbox Code Playgroud)

在创建Service类以使用相同的DataContext注入所有三个存储库时,是否有任何方法?

c# datacontext dependency-injection unity-container

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

使用Unity Framework和验证应用程序块验证方法参数

Validation.Validate()验证应用程序块的方法是否可以将IParameterCollectionUnity提供的每个参数视为我的自定义UserModel


背景:

我试图使用Unity和验证应用程序块来验证方法参数.

我希望能够[RequiresValidation()]用适当的验证属性表示方法和该方法的参数.

所以,像这样:

[RequiresValidation()]
public void SaveUser(UserModel user)
{
  // ...
}

public class UserModel
{
  [StringLengthValidator(3, 255)]
  [RegexValidator(@"^[a-zA-Z0-9]${3,255}")]
  public string Name { get; set; }

  [StringLengthValidator(0, 255)]
  [RegexValidator(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b")]
  public string EMail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个自定义HandlerAttribute,它将启动对验证处理程序的调用,如图所示.

public class RequiresValidationAttribute : HandlerAttribute
{
  public override ICallHandler CreateHandler(IUnityContainer container)
  {
    return new ValidationCallHandler();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,验证处理程序将尝试验证方法的每个参数:

public class ValidationCallHandler : ICallHandler
{
  public int Order { get; set; }

  public …
Run Code Online (Sandbox Code Playgroud)

c# validation enterprise-library unity-container validation-application-bl

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

在UnityContainer中注册NUnit DynamicMock实例

我对Unity和依赖注入有些新意.我正在尝试编写一个类似于下面的单元测试:

[Test]
public void Test()
{
    UnityContainer container = new UnityContainer();
    DynamicMock myMock = new DynamicMock(typeof(IMyInterface));
    container.RegisterInstance(typeof(IMyInterface), myMock.MockInstance);  //Error here

    // Continue unit test...
}
Run Code Online (Sandbox Code Playgroud)

执行此测试时,容器会在RegisterInstance方法中使用该消息抛出ArgumentNullException Value cannot be null. Parameter name: assignmentValueType.

堆栈跟踪的顶行是at Microsoft.Practices.Unity.Utility.Guard.TypeIsAssignable(Type assignmentTargetType, Type assignmentValueType, String argumentName).

为什么我不能在UnityContainer中注册MockInstance,我该如何解决这个问题呢?

nunit dependency-injection mocking ioc-container unity-container

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

实现MVVM Light工具包WPF Unity

我正在为我的WPF应用程序使用MVVMLight工具包.现在我正在阅读Lauren的MIX 10的演示示例.示例代码在SL中,并使用UnityContainer.MVV MVight工具包为WPF提供的模板不使用unitycontainer概念.如何在WPF中使用UnityContainer.

我现在不知道我的问题是否有意义.我没有看到有关如何使用ViewModelLocator的任何文档.也许有人可以提供Lauren在MIX中使用的Demo样本或WPF版本

wpf unity-container mvvm-light

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

通过Unity的同一消息的多个消费者无法在MassTransit中工作

我最近遇到了很多问题,因为包中似乎有一个错误MassTransit.UnityIntegration,主要是因为注册名称没有被考虑.

例如,如果我像这样注册我的类:

var container = new UnityContainer()
    .RegisterType<Consumes<Command1>.All, Handler1>("Handler1")
    .RegisterType<Consumes<Command1>.All, Handler3>("Handler3");
Run Code Online (Sandbox Code Playgroud)

几行之后,我使用LoadFrom扩展方法来获取容器中的注册使用者,如下所示:

IServiceBus massTransitBus = ServiceBusFactory.New(_sbc =>
    {
        _sbc.UseBinarySerializer();
        _sbc.UseControlBus();
        _sbc.ReceiveFrom("msmq://localhost/MyQueue");
        _sbc.UseMsmq(_x =>
            {
                _x.UseSubscriptionService("msmq://localhost/mt_subscriptions");
                _x.VerifyMsmqConfiguration();
            });
        _sbc.Subscribe(_s => _s.LoadFrom(container));
    });
Run Code Online (Sandbox Code Playgroud)

当相关消息到达总线时,我的处理程序永远不会被调用.

在思考了一段时间之后,我决定看一下实现,并且很清楚为什么会发生这种情况:

这是方法中的主要代码LoadFrom:

public static void LoadFrom(this SubscriptionBusServiceConfigurator configurator, IUnityContainer container)
{
    IList<Type> concreteTypes = FindTypes<IConsumer>(container, x => !x.Implements<ISaga>());
    if (concreteTypes.Count > 0)
    {
        var consumerConfigurator = new UnityConsumerFactoryConfigurator(configurator, container);

        foreach (Type concreteType in concreteTypes)
            consumerConfigurator.ConfigureConsumer(concreteType);
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

请注意,它只查找类型,并且不会向前传递任何名称信息.这是FindTypes<T>实施:

static …
Run Code Online (Sandbox Code Playgroud)

.net esb masstransit unity-container command-pattern

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

在Unity中使用带有TEntity的Generic Repository

我正在学习如何在asp.net MVC 5项目中使用Unity Framework for Dependency Injection.

一般来说,我会为我的存储库设置映射,如下所示:

public static void RegisterComponents()
{
    var container = new UnityContainer();

    // e.g. container.RegisterType<ITestService, TestService>();
    container.RegisterType<IModelRepository, ModelRepository>();

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用通用存储库执行此操作,如下所示:

 public class GenericRepository<TEntity> 
       : IGenericRepository<TEntity> where TEntity : class
 { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

出于本能,我会设置并注册这样:

container.RegisterType<IGenericRepository<TEntity>, GenericRepository<TEntity>>();
Run Code Online (Sandbox Code Playgroud)

这不起作用.

我是否需要为每种模型类型注册一个通用存储库?

container.RegisterType<IGenericRepository<Model1>, GenericRepository<Model1>>();
container.RegisterType<IGenericRepository<Model2>, GenericRepository<Model2>>();
container.RegisterType<IGenericRepository<Model3>, GenericRepository<Model3>>();
...
container.RegisterType<IGenericRepository<Model_N>, GenericRepository<Model_N>>();
Run Code Online (Sandbox Code Playgroud)

或者有没有办法为所有模型类和控制器注入一次此存储库?

c# asp.net-mvc unity-container repository-pattern

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

如何在Console App中使用UnityResolver?

我的WebApi项目中有以下解析器:

 config.DependencyResolver = new UnityResolver(container); // HttpConfiguration config
Run Code Online (Sandbox Code Playgroud)

但是在控制台应用程序中,我没有HttpContiguration.如何告诉我的Unity容器从我的控制台应用程序中使用这个DependencyResolver?

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

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

Unity DI与控制器中的MVC 5

我在尝试在MVC控制器中进行依赖注入时遇到了问题.

目前的例外情况如下:

当前类型myproject.Core.ToolbarLogic是一个接口,无法构造.你错过了类型映射吗?

调试我意识到这个异常是从这句话中提出的(包含在Razor视图中):

@{ Html.RenderAction("Toolbar", "Toolbar");  }
Run Code Online (Sandbox Code Playgroud)

在UnityConfig文件中,所有类型都是方便注册的,我在控制器中有一个空的构造函数,异常是从我无法访问调试的地方引发的......此外,我在StackOverflow和Google中阅读了很多答案,我不知道我知道现在要尝试什么(我几乎尝试过所有事情).

任何人都知道DI有什么问题?

码:

ToolbarController.cs

public class ToolbarController : BaseController
{

    [Dependency]
    public IToolbarLogic ToolbarLogic { get; set; }

    public ToolbarController()
    {
    }


    // GET: Common/Toolbar
    public ActionResult Toolbar()
    {
        bool ShowConfidential = ToolbarLogic.ShowConfidential();
        string linkHome = ToolbarLogic.BindHome(base.User.Identity.Name);
        return PartialView(new ToolbarModel() {
            ShowConfidential = ShowConfidential,
            lnkHome = linkHome
        });
        return PartialView();
    }

}
Run Code Online (Sandbox Code Playgroud)

UnityWebActivator.cs

/// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
public static class UnityWebActivator
{
    /// <summary>Integrates Unity when …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unity-container razor asp.net-mvc-5

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

与需要参数的工厂方法统一

我想用需要参数的工厂方法在Unity容器中注册一个类型。这些参数应统一解决,但只能在运行时解决。

工厂方法代码:

public static IApp Create(IOne, ITwo) {...}
Run Code Online (Sandbox Code Playgroud)

注册代码:

container.RegisterType(typeof(IApp), new InjectionFactory(f => App.Create(???, ???)));
Run Code Online (Sandbox Code Playgroud)

我需要什么来替换“ ???” ?

更多信息:

我的Unity配置分为两个阶段。第一阶段(应用程序正在启动),我注册了除一个对象之外的所有对象:

container.RegisterType<IOne, One>();
container.RegisterType<ITwo, Two>();
container.RegisterType<IApp, App>();
// ...
Run Code Online (Sandbox Code Playgroud)

第二阶段(用户登录),我中庸之道注册谁在我所有的类的构造函数中使用的上下文对象的实例(OneTwoApp,...):

var childContainer = container.CreateChildContainer();
childContainer.RegisterInstance<AppEnvironment>(new AppEnvironment(userName));
Run Code Online (Sandbox Code Playgroud)

这是我的代码,不使用InjectionFactory。工作正常。现在,我必须多次注册IApp接口,并每次都调用一个不同的静态方法。静态方法示例:

public static IApp Create(IOne one, ITwo two, AppEnvironment env) 
{
    _one = one;
    _two = two;
    _env = env;
}
Run Code Online (Sandbox Code Playgroud)

如果我向IApp注册此代码:

container.Register(typeof(IApp), new InjectionFactory(f => App.Create(container.Resolve<IOne>(), container.Resolve<ITwo>(), container.Resolve<AppEnvironment>()));
Run Code Online (Sandbox Code Playgroud)

然后没有设置我的env变量。

但是,如果我注册了我的env实例(仅出于测试目的,我不能这样做),它就可以工作。

c# factory unity-container

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