首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微软统一2,如何注册以下?

微软统一2,如何注册以下?
EN

Stack Overflow用户
提问于 2011-05-19 16:01:40
回答 2查看 420关注 0票数 0

现在,我们有一个包含所有数据库调用的dll文件,我无法更改它。不过,我需要从Mvc 3项目中打电话给我。调用它的过程很简单,我使用以下方法:

代码语言:javascript
复制
ManageProvider.GetProxy<T>(ident);

T是一个接口,我想从它得到类(它就像它自己的IoC ),ident是用户标识类。所以通过打电话

代码语言:javascript
复制
var classReturned = ManageProvider.GetProxy<ICommunity>(new UserIden{ Email = "test@test.com" });

我会带着所有的社区功能回来一堂课。现在,我想在我的Mvc 3项目中实现统一。问题是,我是否可以通过统一将这些调用添加到dll文件中?

我想通过以下方式解析该呼叫:

代码语言:javascript
复制
var classReturned = myContainer.Resolve<ICommunity>(new UserIden{ Email = "test@test.com" });

我怎样才能在统一中注册这个(甚至可能)?

更新:

1)与定义依赖属性相比,使用电子邮件/用户Is调用方法更好吗?(除下文外)

2) dll文件中现在有大约20个接口。我应该把它们都添加到同一个存储库中吗?(除下文外)

代码语言:javascript
复制
    public class ProxyWrapper : IDllRepository
    {
        [Dependency]
        public UserIdent UserIdent { get; set; }

        public ICommunity GetCommunity()
        {
            return ManageProvider.GetProxy<ICommunity>(UserIdent);
        }

        public IDesktop GetDesktop()
        {
            return ManageProvider.GetProxy<IDesktop>(UserIdent);
        }
    }

    public interface IDllRepository
    {
        ICommunity GetCommunity();
        IDesktop GetDesktop();
    }

最好的方法是什么,我如何从代码中调用它?依赖属性是否也属于Service反模式?

更新23.05.11

是的,差不多是这样的。它们包含提供给包含dll文件的所有项目的所有逻辑。

关于ManagerProvider。它接受一个接口并返回映射到该接口的类。因此,对于社区来说,界面看起来是这样的(删除了大量的调用以保持其简短,还有帖子、评论、社区创建/更新等):

代码语言:javascript
复制
List<CommunityThread> GetThreads(int pStartRowIndex, int pMaximumRows, string pOrderBy, string pSearchExpression);
Guid? CreateThread(string pTitle, string pDescription, string pPostContent);
bool DeleteThread(Guid pThreadId);
List<CommunityThread> GetCommunityUserThreads(Guid pCommunityUserId); 

2)我无法更新的是ManageProvider.GetProxy的工作方式。GetProxy是dll文件中硬编码的类。这是社区的一部分。类对所有其他接口也是一样的,如果类型(接口).返校课。

代码语言:javascript
复制
private static IManageProxy GetProxyForInterface<T>(UserIdent pIdent)
{
....
     if (typeof(T).Equals(typeof(ICommunity)))
          return new PCommunity();
....
}

3)使用这个新包装器类注册后,我可以通过以下代码调用它(MvcUnityContainer是一个静态类,只有一个名为Container的属性):

代码语言:javascript
复制
var c = MvcUnityContainer.Container.Resolve<IBackendRepository>(new PropertyOverride("UserIdent",
                                                                           new UserIdent()));

Global.asax

代码语言:javascript
复制
IUnityContainer container = InitContainer();                                 
MvcUnityContainer.Container = container;
DependencyResolver.SetResolver(new UnityMvcResolver(container));

问题是,我需要静态类MvcUnityContainer吗?是否可以将DependecyResolver配置为为我做到这一点?类似于(问题是它不接受覆盖参数):

代码语言:javascript
复制
var c = DependencyResolver.Current.GetService<IBackendRepository>(new PropertyOverride("UserIdent", new UserIdent()));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-19 21:13:01

我认为您需要将创建隐藏在另一个抽象之后,例如:

代码语言:javascript
复制
public interface ICommunityRepository
{
    ICommunity GetByEmailAddress(string address);
}

public class ManageProviderCommunityRepository
    : ICommunityRepository
{
    public ICommunity GetByEmailAddress(string address)
    {
        var id = new UserIden { Email = address };
        return ManageProvider.GetProxy<ICommunity>(id);
    }
}

这将隐藏这个抽象后面的ManageProviderUserIden,并允许您稍后用更有用的东西替换它,并使测试更容易。

现在的登记非常容易:

代码语言:javascript
复制
RegisterType<ICommunityRepository, ManageProviderCommunityRepository>();

不要像在示例中那样调用myContainer.Resolve,而是在类中注入依赖项。这使您无法使用服务定位器反模式

票数 3
EN

Stack Overflow用户

发布于 2011-05-19 20:41:27

也许您可以这样做,使用InjectionFactory:

代码语言:javascript
复制
    myContainer.RegisterType<ICommunity>(
        new InjectionFactory(c => ManageProvider.GetProxy<ICommunity>(new UserIden {Email = "test@test.com"})));
    var classReturned = myContainer.Resolve<ICommunity>();

..。虽然您无法将UserIden作为参数传递给解析调用,但我不确定这是否是您想要的。

要注册程序集的所有公共类,您可能可以在Assembly.GetTypes()上迭代并以同样的方式注册它们?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6061481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档