10

Wcf で Autofac を使用して構造化を試みています。

    namespace WcfService1.Model
    {
        [DataContract(IsReference = true)]
        public partial class Account
        {
            [DataMember]
            public int Id { get; set; }
            [DataMember]
            public string Name { get; set; }
            [DataMember]
            public string Surname { get; set; }
            [DataMember]
            public string Email { get; set; }
            [DataMember]
            public Nullable<System.DateTime> CreateDate { get; set; }
        }    
    }

モデル>IAccounRepository.cs

1.

namespace WcfService1.Model
{
  public interface IAccountRepository
    {
        IEnumerable<Account> GetAllRows();
        bool AddAccount(Account item);
    }
}

モデル>AccounRepository.cs

2.

namespace WcfService1.Model
{
    public class AccountRepository:IAccountRepository
    {
        private Database1Entities _context;
        public AccountRepository()
        {
            if(_context == null)
                _context =new Database1Entities();
        }

        public IEnumerable<Account> GetAllRows()
        {
            if (_context == null)
                _context = new Database1Entities();
            return _context.Account.AsEnumerable();
        }        

        public bool AddAccount(Account item)
        {
            try
            {
                if (_context == null)
                    _context = new Database1Entities();
                _context.Entry(item).State = EntityState.Added;
                _context.Account.Add(item);
                _context.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                var str = ex.Message;
                return false;
            }
        }
    }
}
  1. DbConnection > EntityFramework + DbContext

  2. IService1.cs

コード:

namespace WcfService1
{
    [ServiceContract(SessionMode = SessionMode.Allowed)]
    public interface IService1
    {
        [OperationContract]
        IList<Account> GetAccounts();

        [OperationContract]
        bool AddAccount(Account item);
    }
}
  1. Service1.cs

コード:

namespace WcfService1
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1:IService1
    {
        private readonly IAccountRepository _repository;
        public Service1(IAccountRepository repository)
        {
            _repository = repository;
        }    
        public IList<Account> GetAccounts()
        {   
            var items = _repository.GetAllRows().ToList();
            return items;
        }
        public bool AddAccount(Account item)
        {
            item.CreateDate = DateTime.Now;    
            return _repository.AddAccount(item);
        }
    }
}
  1. Service1.svc

コード:

<%@ ServiceHost Language="C#"
                Debug="true"
                Service="WcfService1.Service1, WcfService1"
                Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory, Autofac.Integration.Wcf" %>
  1. Global.asax.cs

コード:

protected void Application_Start(object sender, EventArgs e)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType< AccountRepository>().As< IAccountRepository>();
            builder.RegisterType< Service1 >().As< IService1>();

            AutofacHostFactory.Container = builder.Build();
        }

次のエラーが表示されます。解決策が見つかりませんでした。何が悪いんだ。

エラーメッセージ :

「/」アプリケーションでサーバー エラーが発生しました。

WCF 用に構成されたサービス 'WcfService1.Service1, WcfService1' が Autofac コンテナーに登録されていません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: WCF 用に構成されたサービス 'WcfService1.Service1, WcfService1' が Autofac コンテナーに登録されていません。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[InvalidOperationException: The service 'WcfService1.Service1, WcfService1' configured for WCF is not registered with the Autofac container.]
   Autofac.Integration.Wcf.AutofacHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +667
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath, EventTraceActivity eventTraceActivity) +2943
   System.ServiceModel.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity) +88
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity) +1239

[ServiceActivationException: The service '/Service1.svc' cannot be activated due to an exception during compilation.  The exception message is: The service 'WcfService1.Service1, WcfService1' configured for WCF is not registered with the Autofac container..]
   System.Runtime.AsyncResult.End(IAsyncResult result) +454
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +413
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, String routeServiceVirtualPath, Boolean flowContext, Boolean ensureWFService) +327
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext, Boolean ensureWFService) +46
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +384
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +238
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +114
4

7 に答える 7

19

他の回答に加えて、.svc ファイルの ServiceHost 要素の Service 属性で完全修飾サービス名を使用していることを確認する必要があります。

たとえば、次の代わりに:

<%@ ServiceHost Language="C#" Debug="true" Service="MoviesService.MoviesService" CodeBehind="MoviesService.svc.cs" %>

使用する:

<%@ ServiceHost Language="C#" Debug="true" Service="MoviesService.MoviesService, MoviesService" CodeBehind="MoviesService.svc.cs" %>

ソース: http://jmonkee.net/wordpress/2011/09/05/autofac-wcfintegration-service-not-registered-with-the-autofac-container/

于 2013-10-31T00:40:23.260 に答える
4

サービスは、インターフェイスとしてではなく、セルフとして登録する必要があります。

builder.RegisterType< Service1 >().AsSelf();
于 2012-09-03T07:05:48.160 に答える
2

代わりにService1Like thisを登録するだけですbuilder.RegisterType<Service1>();builder.RegisterType<Service1>().As<IService1>();

于 2012-10-04T17:44:16.560 に答える
0

これを試してください:

var builder = new ContainerBuilder();

builder.Register(c => new AccountRepository()).As<IAccountRepository>();
builder.Register(c => new Service1(c.Resolve<IAccountRepository>())).AsSelf();

AutofacHostFactory.Container = builder.Build();
于 2013-04-16T13:24:38.650 に答える