1

私は AutoFac を初めて使用しますが、これはかなり簡単だと思いました。私は単純なハブを持っています:

public class Chat : Hub
{
    private readonly IHomeTasks _homeTasks;
    public Chat(IHomeTasks homeTasks) 
    {
        _homeTasks = homeTasks;
    }

    public void Send(string text)
    {
        _homeTasks.DoNothing();
        Clients.addMessage(text);
        var user = new UserDocument { Username = text };
    }
}

私の Global.ascx.cs には次のものがあります。

    protected void Application_Start()
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();

        builder.RegisterType<Helpers.AutofacDependencyResolver>().As<SignalR.IDependencyResolver>(); // Not sure if I need this or...

        var container = builder.Build();
        RouteTable.Routes.MapHubs(new Helpers.AutofacDependencyResolver(container));
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

ここからコピーした AutofacDependencyResolver :

public class AutofacDependencyResolver : DefaultDependencyResolver, IRegistrationSource
{
    private readonly ILifetimeScope _lifetimeScope;

    public AutofacDependencyResolver(ILifetimeScope lifetimeScope)
    {
        _lifetimeScope = lifetimeScope;
        _lifetimeScope.ComponentRegistry.AddRegistrationSource(this);
    }

    public override object GetService(Type serviceType)
    {
        object result;
        if (_lifetimeScope.TryResolve(serviceType, out result))
        {
            return result;
        }

        return null;
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        object result;
        if (_lifetimeScope.TryResolve(typeof(IEnumerable<>).MakeGenericType(serviceType), out result))
        {
            return (IEnumerable<object>)result;
        }

        return Enumerable.Empty<object>();
    }

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
    {
        var typedService = service as TypedService;
        if (typedService != null)
        {
            var instance = base.GetServices(typedService.ServiceType);

            if (instance != null)
            {

                return instance.Select(i => RegistrationBuilder.ForDelegate(i.GetType(), (c, p) => i).As(typedService.ServiceType)
                    .InstancePerMatchingLifetimeScope(_lifetimeScope.Tag)
                    .CreateRegistration());
            }
        }

        return Enumerable.Empty<IComponentRegistration>();
    }

    bool IRegistrationSource.IsAdapterForIndividualComponents
    {
        get { return false; }
    }
}

私の HomeTasks は次のようになります。

public class HomeTasks : Sandbox.Tasks.IHomeTasks
{
    public void DoNothing()
    {
    }
}

SignalR.Hosting.AspNet.HttpTaskAsyncHandler 内で次のようなエラーが発生しているため、何も起こっていないように見えます。

アセンブリ 'SignalR、バージョン = 0.5.1.10625、カルチャ = ニュートラル、PublicKeyToken = null' から型 'SignalR.Hosting.IRequest' を読み込めませんでした。

編集:

すべてのSignalR dllを削除してから、dfowlerの回答のために再度追加しましたが、すべてがうまくいきましたが、実際にチャットハブでSend(text)を呼び出すと、次のようになります:

[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Activator.CreateInstance(Type type) +6
   SignalR.Hubs.DefaultHubActivator.Create(HubDescriptor descriptor) +141
   SignalR.Hubs.DefaultHubManager.ResolveHub(String hubName) +71
   SignalR.Hubs.HubDispatcher.CreateHub(IRequest request, HubDescriptor descriptor, String connectionId, TrackingDictionary state, Boolean throwIfFailedToCreate) +679
   SignalR.Hubs.HubDispatcher.OnReceivedAsync(IRequest request, String connectionId, String data) +870
   SignalR.<>c__DisplayClass6.<ProcessRequestAsync>b__4(String data) +73
   SignalR.Transports.ForeverTransport.ProcessSendRequest() +141
   SignalR.Transports.ForeverTransport.ProcessRequestCore(ITransportConnection connection) +128
   SignalR.Transports.ForeverTransport.ProcessRequest(ITransportConnection connection) +37
   SignalR.PersistentConnection.ProcessRequestAsync(HostContext context) +1018
   SignalR.Hubs.HubDispatcher.ProcessRequestAsync(HostContext context) +216
   SignalR.Hosting.AspNet.AspNetHandler.ProcessRequestAsync(HttpContextBase context) +676
   SignalR.Hosting.AspNet.HttpTaskAsyncHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +125
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8968180
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

ここに 1 つのピースが欠けているだけだと思いますが、それが一体何なのかわかりません。

SignalR の配線に問題があると考えるようになったのは、正常に動作する単純なコントローラーも持っているためです。

public class HomeController : Controller
{
    private IHomeTasks _homeTasks;
    public HomeController(IHomeTasks homeTasks)
    {
        _homeTasks = homeTasks;
    }

    public ActionResult Index()
    {
        _homeTasks.DoNothing(); // No problems resolving HomeTasks!
    }

回答で更新

    protected void Application_Start()
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
        builder.RegisterType<Chat>().InstancePerLifetimeScope();

        var container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        RouteTable.Routes.MapHubs(new AutofacSignalrDependencyResolver(container));

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

上記の AppStart メソッドで動作するようになりました。重要な行は builder.RegisterType().InstancePerLifetimeScope(); です。正直なところ、これが最善の方法であるかどうかはわかりません。これは、私がよく知っている[ウィンザー]を使用してこれを理解したため、一種の学習経験でしたが、少なくとも何かを見たいと思うのに十分な時間を費やしたと考えました.私の労働から。これが誰かに役立つことを願っています:D

4

1 に答える 1

2

バージョンの不一致のように見えます。おそらく、型を読み込めないのはそのためです。依存関係のバイナリ互換バージョンを使用していることを確認してください。

于 2012-07-13T06:28:01.630 に答える